こんにちは。
Delphi5Pro、Delphi2007Proで固定長テキスト入出力するPGをメンテしています。
現在はTStringListでファイル入出力を行い、データの格納は
copyで文字列を繋げて行っています。
対象データは1レコード(1行)が4000byteを超えるデータで、
数千件が対象です。
TStringlistですとメモリを大量消費するようですが、
プロのプログラマーがコーディングした場合、
メモリ消費量を抑え、かつ高速に処理できるような方法を取ると
思われますが、一般的にどういったコーディングをされるのでしょう。
もし差支えなければ、サンプルコードなどをご提示いただけると助かります。
読み込んだ後、何を使用しているのか定かではありませんが、私なら、データベース処理を考えます。
「1レコード(1行)が4000byteを超えるデータ」ならば、たぶん正規化して分割できると思います。
そこから検討してはどうですか。
訂正
何を使用⇒なにをしようと
早速のレスをありがとうございます。
例えば業務アプリではなく、データコンバートツールや、
単なる固定長ファイルのチェックツールなどを作るとした場合はどうでしょうか。
やはりデータベースを使用するのが良いですか?
効率化や高速化と汎用性は真逆の特性があります。
なので、妥協点については仕様が
「対象データは1レコード(1行)が4000byteを超えるデータ」
「数千件が対象」
ではまだまだ汎用性が高すぎます。
全データ読み込みは必要か?ソートされているのか?インデックス化できる部位は無いのか?アクセス頻度や挿入削除頻度は?
とパッと思いつくだけでもこれくらい出てきます。
データベースはとても賢いプログラマーが試行錯誤の上にこの効率化と高速化と汎用性を最大限に引き出すように作られたものです。
普通のプログラマであればとことん汎用性を犠牲にでもしない限り、データベースの速度にはかないませんよ。
monaaさん、ありがとうございます。
そりゃ目的が明確でなければ答えはでませんね。
しかし色々とヒントはもらえた気がします。
一度纏めて考え直し、必要があればまたお邪魔させていただきたいと思います。
レスをくださったプロのプログラマーさん、monaaさん、ありがとうございました。
また、よろしくお願いいたします。
固定長なら
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;
ツイート | ![]() |