TStringlist.SaveToFile でメモリ不足 EOutOfMemory

解決


yamada  2013-06-22 01:45:08  No: 44709

タイトルの通り、

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-22 01:57:35  No: 44710

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


take  2013-06-22 02:22:46  No: 44711

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

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

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


yamada  2013-06-22 02:48:35  No: 44712

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-22 03:35:30  No: 44713

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


au  2013-06-22 04:00:02  No: 44714

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


au  2013-06-22 04:04:18  No: 44715

encotingじゃなくてencodingです


yamada  2013-06-25 01:24:28  No: 44716

au様

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

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


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

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






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