固定長データファイルを効率的かつできるだけ高速に入出力するには?

解決


ぱっぱやー  2012-09-28 19:13:49  No: 43056

こんにちは。
Delphi5Pro、Delphi2007Proで固定長テキスト入出力するPGをメンテしています。
現在はTStringListでファイル入出力を行い、データの格納は
copyで文字列を繋げて行っています。

対象データは1レコード(1行)が4000byteを超えるデータで、
数千件が対象です。

TStringlistですとメモリを大量消費するようですが、
プロのプログラマーがコーディングした場合、
メモリ消費量を抑え、かつ高速に処理できるような方法を取ると
思われますが、一般的にどういったコーディングをされるのでしょう。

もし差支えなければ、サンプルコードなどをご提示いただけると助かります。


プロのプログラマー  2012-09-28 19:31:21  No: 43057

読み込んだ後、何を使用しているのか定かではありませんが、私なら、データベース処理を考えます。
「1レコード(1行)が4000byteを超えるデータ」ならば、たぶん正規化して分割できると思います。
そこから検討してはどうですか。


プロのプログラマー  2012-09-28 19:34:05  No: 43058

訂正
何を使用⇒なにをしようと


ぱっぱやー  2012-09-28 20:18:54  No: 43059

早速のレスをありがとうございます。
例えば業務アプリではなく、データコンバートツールや、
単なる固定長ファイルのチェックツールなどを作るとした場合はどうでしょうか。
やはりデータベースを使用するのが良いですか?


monaa  2012-09-28 21:19:06  No: 43060

効率化や高速化と汎用性は真逆の特性があります。
なので、妥協点については仕様が
「対象データは1レコード(1行)が4000byteを超えるデータ」
「数千件が対象」
ではまだまだ汎用性が高すぎます。
全データ読み込みは必要か?ソートされているのか?インデックス化できる部位は無いのか?アクセス頻度や挿入削除頻度は?
とパッと思いつくだけでもこれくらい出てきます。

データベースはとても賢いプログラマーが試行錯誤の上にこの効率化と高速化と汎用性を最大限に引き出すように作られたものです。
普通のプログラマであればとことん汎用性を犠牲にでもしない限り、データベースの速度にはかないませんよ。


ぱっぱやー  2012-09-28 22:54:49  No: 43061

monaaさん、ありがとうございます。
そりゃ目的が明確でなければ答えはでませんね。
しかし色々とヒントはもらえた気がします。
一度纏めて考え直し、必要があればまたお邪魔させていただきたいと思います。

レスをくださったプロのプログラマーさん、monaaさん、ありがとうございました。
また、よろしくお願いいたします。


KHE00221  2012-10-02 04:14:10  No: 43062

固定長なら

const
   DBSize = 4000;

function DBOpen(FileName: String): Integer;
begin
    Result := FileOpen (FileName,fmOpenReadWrite);
end;

procedure DBClose(Handle: Integer);
begin
    FileClose (Handle);
end;

function DBRead(Handle: Integer): String; overload;
var
    Buffer: array[0..DBSize] of Char;
begin
    Buffer := '';
    FileRead(Handle,Buffer,SizeOf(Buffer));
    Result := StrPas(Buffer);
end;

function DBRead(Handle,Index: Integer): String; overload;
var
    Buffer: array[0..DBSize] of Char;
begin
    FileSeek(Handle,0,Index * DBSize);
    Result := DBRead(Index);
end;

function DBWrite (Handle: Integer; Value: String): Integer; overload;
var
    Buffer: array[0..DBSize] of Char;
begin
    Result := FileWrite (Handle,Buffer,SizeOf(Buffer));
end;

function DBWrite (Handle,Index: Integer; Value: String): Integer; overload;
begin
    FileSeek(Handle,0,Index * DBSize);
    Result := DBWrite (Handle,Value);
end;

function DBAppend(Handle: Integer; Value: String): Integer;
begin
    FileSeek(Handle,2,0);//ファイルの最後に移動
    Result := DBWrite (Handle,Value);
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加