【问题标题】:c# reading text file with contention from other instances时间:2018-08-10 标签:c#reading text file with content from other instances
【发布时间】: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


【解决方案1】:

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

  • 首先完全读入内存,一次完成,例如使用File.ReadAllText方法

  • 处理后的内容,已经存在于内存中,所以它会快得多,从磁盘中逐行读取.

【讨论】:

    【解决方案2】:
    1. 尝试以只读模式打开文件
    2. 尝试使用内存映射文件,它可以为并发文件访问提供最佳性能

    【讨论】:

      猜你喜欢
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2013-02-18
      • 2015-02-05
      • 2018-06-21
      • 1970-01-01
      相关资源
      最近更新 更多