并行读/写文件是个好主意吗?

时间:2014-02-28 20:08:11

标签: r foreach parallel-processing

我有大量的数据文件描述了大量气象站的天气。这些文件是每小时一次,包含在按日期分隔的文件中。

例如:

20100101.csv
20100102.csv
20100103.csv
.
.
20140228.csv

我需要通过 station 聚合数据,然后将其写入磁盘。也就是说,对于每个天气文件,我需要提取站 i 的数据,然后将其写入磁盘。

输出:

station_001.csv
station_002.csv
.
.
station_999.csv

为了加快速度,我决定使用foreachdoMC软件包并行读取每日文件,并且我还会在并行聚合后将站文件写入磁盘。

更具体地说,我使用foreach读取文件并使用.combine="rbind"组合它们(我有足够的内存在内存中创建一个巨大的数据集)。之后,我有另一个foreach循环,我按站对数据进行子集化,然后写入磁盘。我发现通过并行读/写可以获得非常好的速度提升。

我的问题是:并行读/写是一个好主意吗?我确保不同的线程不读取相同的数据文件或写入同一个站文件,但经过一些谷歌搜索后,似乎并行化i / o任务可能不是一个好主意? (Example I found saying no to parallel Input/Outputpost on R-bloggers showing parallel reads

2 个答案:

答案 0 :(得分:3)

Performance Pro

  • 使用多个线程可以提高多核计算机的性能

Performance Con

  • 从磁盘读取时,CPU性能通常不是您的瓶颈。磁盘上的文件通常用尽可能多的顺序块写入。这意味着旋转磁盘上的指针不必移动到远处读取下一个段。如果您并行执行任务,则指针必须重复移动以在任何停止的位置拾取。这意味着您的磁盘写入速度最终会变慢*。

    *固态硬盘可能没有这个问题(我对SSD的知识不多,但我认为它们不受上下文切换的影响)。

答案 1 :(得分:3)

你说你注意到性能方​​面的改进,所以对你来说这显然是一个好主意。

加快速度的其他方法 - 查看fread中的data.table - 这将显着加快顺序阅读速度(提高3倍或更多)。使用rbindlist(也来自data.table)进行合并也可以提高速度(此处使用foreach的示例用法 - R foreach with .combine=rbindlist)。