c#从其他实例中读取带有争用的文本文件

时间:2013-05-14 08:50:40

标签: c# buffer readline bufferedstream

我有一个应用程序,使用以下方法从文本文件中读取数据:

                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上填充整个缓冲区吗?即如果我的缓冲区>比文件大,整个文件可以/应该被读入内存。在我看来,操作系统通过允许那么多缓冲区工作,但不一定使用它。

2 个答案:

答案 0 :(得分:1)

根据评论,如果文件大小约为2MB,则快速处理解决方案将

  • 首先使用例如File.ReadAllText方法

  • 一次性完全读入内存
  • 处理内容之后,已存在于内存中,因此更多更快,从磁盘逐行读取>

答案 1 :(得分:0)

  1. 尝试以只读模式打开文件
  2. 尝试使用内存映射文件,它可以为concurent文件访问提供最佳性能