TStringlist.SaveToFile でメモリ不足 EOutOfMemory

解決


yamada  2013-06-21 16:45:08  No: 44709  IP: 192.*.*.*

タイトルの通り、

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入れてみましたが、状況は変わりませんでした。

回避方法、代替案ございましたら、
何卒ご教授お願いします。

編集 削除
au  2013-06-21 16:57:35  No: 44710  IP: 192.*.*.*

StringListに貯めてなんらかの処理をするわけでは無く、単に保存するだけなんであれば TStreamWriter使ってみたらどうでしょう?

編集 削除
take  2013-06-21 17:22:46  No: 44711  IP: 192.*.*.*

たしかに自分が質問した件に似ていますね
ソースにCreateがあってFreeが無いのが気になりますが

auさんのおっしゃるとおり「ためる」のではなく
その都度ファイルに書き込む方法ではダメでしょうか?

TFileStreamを使うのも手だと思います。

編集 削除
yamada  2013-06-21 17:48:35  No: 44712  IP: 192.*.*.*

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を書き忘れてました。

ありがとうございました。
解決とさせて頂きます。

編集 削除
yamada  2013-06-21 18:35:30  No: 44713  IP: 192.*.*.*

解決済みなんですが、
TStreamWriterってUTF8なんですね。。
Shift-Jisに切り替えるのはどうしたら良いのでしょうか?
重ね重ねお願いします。

編集 削除
au  2013-06-21 19:00:02  No: 44714  IP: 192.*.*.*

コンストラクタでEncoting指定出来ませんでした?

編集 削除
au  2013-06-21 19:04:18  No: 44715  IP: 192.*.*.*

encotingじゃなくてencodingです

編集 削除
yamada  2013-06-24 16:24:28  No: 44716  IP: 192.*.*.*

au様

度々すいません。
encoding指定出来ました。
見逃してました。

助かりました。ありがとうございます。

編集 削除