タイトルの通り、
var
STL:TStringlist;
begin
STL:=TStringList.Create;
STL.Add('aa,bb,cc,dd,ee,ff');//150万回
STL.SaveToFile
end;
を行うと、
例外クラス EOutOfMemory (メッセージ 'メモリが足りません')を送出しました。というエラーが出ます。
100万行程度だったら大丈夫だったのですが。
1行分の容量は大体180バイトぐらいです。
やりたいことは、文字列をためて、CSVで保存したいだけです。
https://www.petitmonte.com/bbs/answers?question_id=4425
にありましたように、FASTMM入れてみましたが、状況は変わりませんでした。
回避方法、代替案ございましたら、
何卒ご教授お願いします。
StringListに貯めてなんらかの処理をするわけでは無く、単に保存するだけなんであれば TStreamWriter使ってみたらどうでしょう?
たしかに自分が質問した件に似ていますね
ソースにCreateがあってFreeが無いのが気になりますが
auさんのおっしゃるとおり「ためる」のではなく
その都度ファイルに書き込む方法ではダメでしょうか?
TFileStreamを使うのも手だと思います。
au様 take様
ありがとうございます!
エラーもなく、TStreamWriterで解決しました。
下記ソースコードです。あってますよね?
var
Writer:TStreamWriter;
begin
try
Writer:=TStreamWriter.Create('C:\aaa.csv', False);
Writer.WriteLine('aa,bb,cc,dd,ee,ff');
finally
FreeAndNil(Writer);
end;
end;
最後、Freeを書き忘れてました。
ありがとうございました。
解決とさせて頂きます。
解決済みなんですが、
TStreamWriterってUTF8なんですね。。
Shift-Jisに切り替えるのはどうしたら良いのでしょうか?
重ね重ねお願いします。
コンストラクタでEncoting指定出来ませんでした?
encotingじゃなくてencodingです
au様
度々すいません。
encoding指定出来ました。
見逃してました。
助かりました。ありがとうございます。
ツイート | ![]() |