R 并行读/写文件是个好主意吗?
我有大量的数据文件来描述大量气象站的天气。这些文件是每小时一次的,包含在按日期分隔的文件中 例如:R 并行读/写文件是个好主意吗?,r,foreach,parallel-processing,R,Foreach,Parallel Processing,我有大量的数据文件来描述大量气象站的天气。这些文件是每小时一次的,包含在按日期分隔的文件中 例如: 20100101.csv 20100102.csv 20100103.csv . . 20140228.csv 我需要按站点聚合数据,然后将其写入磁盘。也就是说,对于这些天气文件中的每一个,我都需要提取stationI的数据,然后将其写入磁盘 输出: station_001.csv station_002.csv . . station_999.csv 为了加快速度,我决定使用foreach和
20100101.csv
20100102.csv
20100103.csv
.
.
20140228.csv
我需要按站点聚合数据,然后将其写入磁盘。也就是说,对于这些天气文件中的每一个,我都需要提取stationI的数据,然后将其写入磁盘
输出:
station_001.csv
station_002.csv
.
.
station_999.csv
为了加快速度,我决定使用foreach
和doMC
包并行读取每日文件,并在按站点并行聚合后将站点文件写入磁盘
更具体地说,我使用foreach
读取文件,并使用.combine=“rbind”
组合它们(我有足够的内存在内存中创建一个巨大的数据集)。之后,我有另一个foreach
循环,在这个循环中,我按站点将数据子集,然后写入磁盘。我发现通过并行读/写,我体验到了非常好的速度提升
我的问题是:并行读/写是个好主意吗?我确保不同的线程不会读取同一个数据文件或写入同一个工作站文件,但在谷歌搜索之后,并行I/o任务似乎不是一个好主意?(,和a)Performance Pro
- 使用多线程可以提高多核机器上的性能
- 从磁盘读取数据时,CPU性能通常不是瓶颈。磁盘上的文件通常以尽可能多的顺序块写入。这意味着旋转磁盘上的指针不必移动到读取下一段的最远位置。如果并行执行任务,指针必须反复移动才能拾取其停止的位置。这意味着您的磁盘写入速度最终将变慢* *固态驱动器可能没有这个问题(我对SSD不太了解,但我想它们根本不会受到上下文切换的影响)
加快速度的其他方法-查看
data.table
中的fread
,这将显著加快顺序读取速度(提高3倍或更多)。使用rbindlist
(也来自data.table
)进行组合还应提供速度提升(例如使用foreach
此处-)。一些SSD根本不受影响,但通常它们使用内部并行性,以便以最佳速度传输数据。感谢您的回答,我怀疑类似于你所说的表演骗局。我想知道创建的每个线程是否都在竞争写入磁盘,或者任务是否被缓冲。我正在使用的机器上没有SSD。@我保证,如果两个线程同时向磁盘写入一个大文件,它们将相互竞争。如果您曾经同时从Internet下载过两个大文件,那么您知道会发生这种情况,因为您可以看到每个文件的进度条都在移动。@John好的,这是有道理的。我将尝试使用和不使用并行写入进行基准测试。这与并行读取文件相同吗?@ialm如果两个独立线程并行读取两个不同的文件,则磁盘将显示“读取-查找-读取”模式。磁盘的读取速度通常比其寻道速度快得多,因此如果进行大量寻道,它肯定会减慢速度。我预测您的基准测试不仅会显示并行比顺序慢,而且并行的速度将是顺序的两倍多。我注意到性能的提高,但我担心其他事情,例如数据损坏等。也许我有点偏执。感谢您对fread
和rbindlist
的建议-我以后一定会查看data.table
。