我有大量的数据文件描述了大量气象站的天气。这些文件是每小时一次,包含在按日期分隔的文件中。
例如:
20100101.csv
20100102.csv
20100103.csv
.
.
20140228.csv
我需要通过 station 聚合数据,然后将其写入磁盘。也就是说,对于每个天气文件,我需要提取站 i 的数据,然后将其写入磁盘。
输出:
station_001.csv
station_002.csv
.
.
station_999.csv
为了加快速度,我决定使用foreach
和doMC
软件包并行读取每日文件,并且我还会在并行聚合后将站文件写入磁盘。
更具体地说,我使用foreach
读取文件并使用.combine="rbind"
组合它们(我有足够的内存在内存中创建一个巨大的数据集)。之后,我有另一个foreach
循环,我按站对数据进行子集化,然后写入磁盘。我发现通过并行读/写可以获得非常好的速度提升。
我的问题是:并行读/写是一个好主意吗?我确保不同的线程不读取相同的数据文件或写入同一个站文件,但经过一些谷歌搜索后,似乎并行化i / o任务可能不是一个好主意? (Example I found saying no to parallel Input/Output和post on R-bloggers showing parallel reads)
答案 0 :(得分:3)
Performance Pro
Performance Con
从磁盘读取时,CPU性能通常不是您的瓶颈。磁盘上的文件通常用尽可能多的顺序块写入。这意味着旋转磁盘上的指针不必移动到远处读取下一个段。如果您并行执行任务,则指针必须重复移动以在任何停止的位置拾取。这意味着您的磁盘写入速度最终会变慢*。
*固态硬盘可能没有这个问题(我对SSD的知识不多,但我认为它们不受上下文切换的影响)。
答案 1 :(得分:3)
你说你注意到性能方面的改进,所以对你来说这显然是一个好主意。
加快速度的其他方法 - 查看fread
中的data.table
- 这将显着加快顺序阅读速度(提高3倍或更多)。使用rbindlist
(也来自data.table
)进行合并也可以提高速度(此处使用foreach
的示例用法 - R foreach with .combine=rbindlist)。