【发布时间】:2013-05-14 08:50:40
【问题描述】:
我有一个从文本文件中读取数据的应用:
CRD.reader = new StreamReader(fn,Encoding.UTF8,true,1024);
CRD.readLine();
但是我在我的 24 核机器上并行运行了 16 个该应用程序的实例。当我这样做时,所花费的总时间比单独运行一个实例所花费的时间要长得多(即使它们是并行运行的)。我认为这是因为磁盘争用?
我看到了使用缓冲流的建议,但我不明白这与上面的代码有何不同。当然可以像我一样指定缓冲区大小 - 我已经在使用“缓冲”流了?
对于我的代码,我尝试了各种不同大小的缓冲区 - 但似乎没有太大区别。
EDIT 1
如果有人能解释缓冲流与我所做的不同 - 那将非常有帮助
EDIT 2
如果我设置一个大缓冲区
CRD.reader = new StreamReader(fn,Encoding.UTF8,true,65536);
CRD.readLine();
我可以强制在第一个 readLine 上填充整个缓冲区吗?即如果我的缓冲区大于文件大小,则可以/应该将整个文件读入内存。在我看来,操作系统通过允许那么多缓冲区来工作,但不一定要使用它。
【问题讨论】:
-
为什么需要从当代文件中读取所有进程?
-
首先确定它真的是是由于磁盘争用。将虚拟数据加载到内存中进行测试,看看它是否仍然变慢了很多。因为我认为这不会是磁盘争用,特别是如果所有进程都是从文件中读取而不是写入文件。
-
@Matthew 我可以看到资源 mon 中的磁盘工作正常 - 但 perf mon 中的 CPU 只是可用资源的一小部分
-
@Tigran 我的重点是并行执行以加快处理速度
-
@ManInMoon:你的文本文件有多大?
标签: c# buffer readline bufferedstream