32ビット版8GBメモリを搭載したWin 10システムでコンパイルする。 Tstringlist.Loadfromfileを使用して150MBのASCIIファイルをロードしようとなぜTstringlist.LoadFromfileはかなりのサイズのファイルをロードできませんか?
は1200Mbをレポートタスクマネージャで「メモリ不足エラー」に使用できます。でも、ユニコードの50%の冗長性を持つ
は非効率のそのレベルを説明することはできません!
何が起こっているのですか?
例コード。
unit Unit3;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm3 = class(TForm)
OpenDialog1: TOpenDialog;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
var f:tstringlist;
begin
if opendialog1.Execute then
begin
f:=Tstringlist.create;
try
f.Loadfromfile(Opendialog1.Filename);
finally
f.free
end
end;
end;
end.
要求されたとして、以下のファイルからいくつかのrepresentitiveテキストが....
AcDbPolyline
90
5
70
0
10
100091.01
20
59019.75
10
100077.39
20
59001.49
10
100070.7
20
58974.72
10
100066.85
20
58942.73
10
100065.12
20
58920.69
0
LWPOLYLINE
5
メモ帳++ 27万行を持つものとして、ファイルを報告します。
32ビットプロセスで8GBでシステムがどのような処理を行うのか自分自身に問い合せてください。それは2GBだけアドレスすることができます。 PEオプションでLARGEADDRESSAWAREを有効にすると、4GBのアドレス空間が得られます。このようなファイルを読み込むための簡単なプログラムが成功するため、目に会うよりもこれ以上のことがあると私は思っています。 –
私の見解では、GUIコントロールにこれを実際にロードしようとしている可能性があります。 190MBのテキストファイルを文字列リストに読み込むのに問題はありません。実際には、そのファイルを3つの異なるインスタンスに同時に読み込むことができます(同時にすべてのメモリに)。 4つ目の場合にのみ、メモリ不足のエラーが発生します。ですから、私はあなたが再生を提供するのをより困難に働き、少し戦闘的であることをお勧めします。 –
完全なユニットを表示するようにコードを更新しました。私は新しいvclプロジェクトを作成し、ボタンとオープンダイアログを追加してファイルをロードしました。 –