我有一个应用程序,使用以下方法从文本文件中读取数据:
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上填充整个缓冲区吗?即如果我的缓冲区>比文件大,整个文件可以/应该被读入内存。在我看来,操作系统通过允许那么多缓冲区工作,但不一定使用它。
答案 0 :(得分:1)
根据评论,如果文件大小约为2MB
,则快速处理解决方案将
首先使用例如File.ReadAllText方法
处理内容之后,已存在于内存中,因此更多更快,从磁盘逐行读取>
答案 1 :(得分:0)