【发布时间】:2020-12-14 10:02:04
【问题描述】:
我正在处理大型文本文件(大于 100MB)。我需要尽可能快的总行数。我目前正在使用下面的代码(更新:添加了 try-finally):
var
SR: TStreamReader;
totallines: int64;
str: string;
begin
SR:=TStreamReader.Create(myfilename, TEncoding.UTF8);
try
totallines:=0;
while not SR.EndOfStream do
begin
str:=SR.ReadLine;
inc(totallines);
end;
finally
SR.Free;
end;
end;
有没有更快的方法来获得总分?
【问题讨论】:
-
您必须使用
try..finally块来保护您的对象。但是要回答您的问题:可能最快的方法是将其作为二进制文件读取,然后遍历其字节并计算您找到的 CRLF 序列的数量。您上面的代码很慢,因为您不仅要计算行数,还要将它们提取为字符串。 -
大于 100MB 并不能说明什么。您如何处理这将在很大程度上取决于您所说的比 100MB 大多少。管理 1GB 文件的方式与管理 100GB 文件的方式大不相同。
-
假设 10GB 是最大值。有趣的是任务管理器在执行上面的代码时显示 CPU 使用率很高,但磁盘使用率很低。
-
是的,因为您正在分配内存以在计数时将文件的每一行复制到一个字符串中。
-
@dummzeuch:OP 使用的是 UTF-8,所以如果你找到一个字节 10,你就知道它是一个 LF。对于 CR 也是如此。请参阅en.wikipedia.org/wiki/UTF-8 处的表格。
标签: delphi streamreader delphi-10.3-rio