2017-04-05 127 views
-3

我想从文件读取字节,处理它们,然后将进程的输出写入另一个文件。由于读/写是瓶颈(处理速度很快),我应该能够通过同时读写来将速度几乎加倍(如果文件位于不同的驱动器上)。同时从一个文件读取并写入另一个文件

我可以通过进程间通信来做到这一点,但这似乎是过度杀伤。有没有一个简单的方式来实现这一目标?

编辑

也许我还不够清楚。我想以下几点:

  1. 读块
  2. 过程中它
  3. 开始写输出
  4. 到1,而写

EDIT 2

@downvoters护理解释为什么? 明显是什么,dasblinkenlight写道,它甚至不值得一个问题?我怀疑我是只有谁不知道。

+0

如果您为每个文件打开了流,您可以从一个流中读取数据,然后将其写入另一个数据流中,但不管您喜欢。 – David

+0

@大卫这不是同时发生的。我想加快这个速度。 – ispiro

+1

由于I/O确实可能是瓶颈,因此无论如何,只要您在合理大小的区块中进行读写操作,就会同时进行读写操作。操作系统将为您并行执行I/O。 – dasblinkenlight

回答

2

我应该几乎能够通过读写同时加倍速度。

除非你读内存中的整个文件一次,增加一倍的速度是不可能的,因为OS通过优化阅读readahead延迟。

操作系统应用了参考位置原则:它很快就会发现您的程序正在顺序读取,并且使用预读来预取接下来的几个块。当你的程序完成写入并准备好再次读取数据时,数据已经存在于缓冲区中,所以操作系统将把它提供给你的程序。当你的程序等待写入完成时,操作系统会提供更多的数据,所以循环将继续,几乎不需要等待读取。

作为实验问题,您可以尝试通过使用ReadAsyncWriteAsync API来使您自己的程序使用asynchronous I/O。这一过程将走如下:

  1. 之前进入循环,设置Task pendingWrite = null
  2. 开始ReadAsyncawait其完成
  3. 如果没有其他可用的数据,退出循环(第8步)读
  4. 根据需要处理数据
  5. 查看是否有挂起的写入任务。如果有,await其完成
  6. 启动下一个写有WriteAsync和任务分配给pendingWrite
  7. 返回由上一个周期第2步完成的任务pendingWrite
  8. await
+1

您编辑中的算法似乎被阻止。步骤2只会在块写入完成时完成,并且步骤3将在块读取完成时完成。 (因为“等待”)。或者你是否试图展示操作系统如何处理它?或者我误解了你的算法? (随意忽略这个评论,你的主要答案就是我现在真正需要的。)我们在这里获得的Async的一切都是UI仍然可以工作。 – ispiro

+0

@ispiro你是对的,我应该等待前一次写入完成到读取处理后。这样,先前写入和当前读取将同时处于活动状态(即,等待下一次读取时等待写入将继续)。不过,我预计这种变化不会产生可衡量的变化。 – dasblinkenlight

相关问题