Delphi中的文件流 – 最佳缓冲区大小

Delphi中的文件流 – 最佳缓冲区大小,第1张

概述我正在运行Delphi RAD Studio XE2.我最近一直在玩文件流,并发现一些有趣的结果引导我这个问题. Delphi中TStreamReader的最佳缓冲区大小是多少?例如,我正在以doubleTABdoubleTABdouble形式加载一个包含200万行的1GB文件.如果我使用以下代码将其加载到TStringList中,我会针对不同的缓冲区大小获得显着不同的结果.结果我的意思是处理速度 我正在运行Delphi RAD Studio XE2.我最近一直在玩文件流,并发现一些有趣的结果引导我这个问题.

Delphi中TStreamReader的最佳缓冲区大小是多少?例如,我正在以doubleTABdoubleTABdouble形式加载一个包含200万行的1GB文件.如果我使用以下代码将其加载到TStringList中,我会针对不同的缓冲区大小获得显着不同的结果.结果我的意思是处理速度和RAM使用率.

reader := TStreamReader.Create(fileLocation,TEnCoding.UTF8,True,NumBytes);try  stringList.BeginUpdate;  try    stringList.Clear;    while not reader.EndOfStream do      stringList.Add(reader.Readline);    finally      stringList.EndUpdate;    end;  finally    reader.Free;  end;end;

最佳缓冲区大小似乎介于1024和4096之间.如果设置小于1024,它似乎线性减速并且似乎使用更多RAM.如果它设置在4096以上,它似乎会以指数方式减速.

为什么我会看到这些行为,如何确定任务的最佳缓冲区大小?另外,最大缓冲区大小是多少?

编辑

我运行以下代码以使用上述文件大小提取运行时间:

startTime := Now();myStreamReader := TStreamReader.Create(fileLocation,numBytes);myStringList := TStringList.Create;try  myStringList.BeginUpdate;  try    myStringList.Clear;    while not myStreamReader.EndOfStream do      myStringList.Add(myStreamReader.Readline);    finally      myStringList.EndUpdate;    end;  finally    myStreamReader.Free;  end;processtime := Now() - startTime;myStringList.Free;

示例运行时间被提取为:

Buffer Size 32. Done in 69sBuffer Size 64. Done in 69sBuffer Size 96. Done in 69sBuffer Size 128. Done in 70sBuffer Size 160. Done in 60sBuffer Size 192. Done in 57sBuffer Size 224. Done in 52sBuffer Size 256. Done in 50sBuffer Size 512. Done in 44sBuffer Size 768. Done in 40sBuffer Size 1024. Done in 39sBuffer Size 1280. Done in 41sBuffer Size 1536. Done in 44sBuffer Size 1792. Done in 40sBuffer Size 2048. Done in 39sBuffer Size 2304. Done in 41sBuffer Size 2560. Done in 41sBuffer Size 2816. Done in 42sBuffer Size 3072. Done in 43sBuffer Size 3328. Done in 43sBuffer Size 3584. Done in 45sBuffer Size 3840. Done in 44sBuffer Size 4096. Done in 45sBuffer Size 4352. Done in 47sBuffer Size 4608. Done in 46sBuffer Size 4864. Done in 46sBuffer Size 5120. Done in 48sBuffer Size 5376. Done in 49sBuffer Size 5632. Done in 51sBuffer Size 5888. Done in 51sBuffer Size 6144. Done in 52sBuffer Size 6400. Done in 54sBuffer Size 6656. Done in 53sBuffer Size 6912. Done in 55sBuffer Size 7168. Done in 55sBuffer Size 7424. Done in 56sBuffer Size 7680. Done in 57sBuffer Size 7936. Done in 65sBuffer Size 8192. Done in 62sBuffer Size 8448. Done in 63sBuffer Size 8704. Done in 64sBuffer Size 8960. Done in 64sBuffer Size 9216. Done in 66sBuffer Size 9472. Done in 66sBuffer Size 9728. Done in 68sBuffer Size 9984. Done in 68sBuffer Size 10240. Done in 69s

至于RAM使用情况,缓冲区大小低于256导致总共使用5GB RAM,缓冲区大小超过1024,总使用量约为3.5GB.例如,使用2kb,4kb和8kb缓冲区的RAM;请参阅:

解决方法 @Trojanian,你上面提到的代码类似于你在上一篇文章 TStringList.LoadFromFile – Exceptions with Large Text Files中的Remy Lebeau的回答.我也很喜欢Remy的例子,它可以加载更大的文件但是小文件的性能大约是TStrings.LoadFromfile的一半.我自己试图切换缓冲区大小并没有提高性能.

然后我找到了下面的代码示例,Alternative to TStrings.LoadFromFile or TStringList.LoadFromFile,它使用128kb缓冲区,并且与TStrings.LoadFromfile相比,我的大文件的加载时间减半,即当我使用XE3时,比上面的代码快x4.

总结

以上是内存溢出为你收集整理的Delphi中的文件流 – 最佳缓冲区大小全部内容,希望文章能够帮你解决Delphi中的文件流 – 最佳缓冲区大小所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1272000.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存