- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 32 位、8GB 内存的 Win 10 系统上编译。
尝试使用 Tstringlist.Loadfromfile 加载 150Mb ASCII 文件会出现“内存不足错误”,任务管理器报告已使用 1200Mb。
即使有 50% 的 Unicode 冗余也无法解释这种低效率!
知道发生了什么吗?
示例代码。
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.
根据要求,下面文件中的一些代表性文本......
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
Notepad++ 报告该文件有 2700 万行。
最佳答案
每个字符串都需要单独的堆分配。每个堆分配都会产生一个内存块,但也会产生内存管理器使用的一些元数据。最重要的是,字符串有自己的元数据、引用计数和长度。
如果您的文件包含许多非常短的行,那么元数据很容易占据主导地位。在极端情况下,单个字符串很容易消耗 20 个字节或更多。从我的头脑中,我不知道实际的开销数字,所以这是一个猜测。
如果行很短,就会有很多字符串。字符串列表所拥有的指针数组本身可能非常大。如果通过调整内存大小来分配可能会导致碎片。你说有2700万行。每行有两个指针,一个是字符串,一个是其关联对象,仅此一项就超过 200MB。
总而言之,TStringList
对于您的任务来说是错误的类型。您最好使用字符串读取器对象逐行读取文件。或者将整个文件加载到内存中并使用专用类型将行映射到偏移量,就像文本编辑器一样。事实上,文本编辑器通常使用内存映射来避免地址空间危机。如果不知道您想如何处理该文件,就很难提出建议,但我希望我已经帮助您理解为什么您当前的方法没有 future 。
关于delphi - 为什么 Tstringlist.LoadFromfile 无法加载合理大小的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41977348/
我有一个曾经是 TreeView 控件的菜单,但现在我想让每个项目更加直观,并向树中的每个对象添加更多信息。 我的第一个意图是制作一个代表项目的用户控件,并在运行时将它们添加到面板中。这是一个好方法吗
我是 Docker 新手,想知道是否有可能(并且是一个好主意)在 Docker 容器中进行开发。我的意思是创建一个容器,执行 bash,安装和配置我需要的一切,然后开始在容器内进行开发。 容器将成为我
在 Java 中: Parent obj = new Child(); 我创建了一个 Parent 类型的对象。我假设我只能调用父类中定义的方法。因此,我无法调用 Child 中定义的“附加”方法或访
注意:我省略了其他两个阶段(V 和 W)的代码,示例中不需要。 我很确定,我这样处理“开”和“关”时间的方式并不是一种有效的方式。 我想使用查找表实现“开”和“关”脉动。计时器应与表的当前选定值进行比
当代码中包含 Java instanceof 运算符时,许多人会扬起眉毛并说这是禁忌。例如,在这个 other SO Q&A ,答案说: Note that if you have to use th
我是一名优秀的程序员,十分优秀!