【问题标题】:Is it a good idea to read/write files in parallel?并行读/写文件是个好主意吗?
【发布时间】:2014-02-28 20:08:10
【问题描述】:

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

例如:

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

【问题讨论】:

    标签: r foreach parallel-processing


    【解决方案1】:

    性能专业版

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

    性能保证

    • 从磁盘读取时,CPU 性能通常不是您的瓶颈。磁盘上的文件通常被写入尽可能多的连续块中。这意味着旋转磁盘上的指针不必移动那么远即可读取下一段。如果您并行执行任务,则指针必须反复移动才能从停止的地方继续。这意味着您的磁盘写入速度最终会变慢*。

      *固态硬盘可能没有这个问题(我对 SSD 了解不多,但我想它们根本不会受到上下文切换的影响)。

    【讨论】:

    • 一些 SSD 根本不受影响,但通常它们使用内部并行性以便以最佳速度交付数据。
    • 感谢您的回答,我怀疑与您提到的性能骗局类似。我想知道创建的每个线程是否竞争写入磁盘,或者任务是否被缓冲。我正在使用的机器上没有 SSD。
    • @ialm 我保证如果两个线程同时将一个大文件写入磁盘,它们将竞争。如果你曾经同时从网上下载过两个大文件,那么你就知道会发生这种情况,因为你可以看到每个文件移动的进度条。
    • @John 好的,这是有道理的。我将尝试使用和不使用并行写入进行基准测试。这对于并行读取文件是否相同?
    • @ialm 如果两个独立线程并行读取两个不同的文件,您的磁盘将呈现“读取-查找-读取”模式。磁盘的读取速度通常 比它的寻道速度快,所以如果你进行大量寻道,它肯定会变慢。我预测您的基准测试不仅会显示并行比顺序慢,而且并行会慢两倍以上
    【解决方案2】:

    你说你注意到性能改进,那么这对你来说显然是个好主意。

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

    【讨论】:

    • 我注意到性能有所提高,但我担心其他事情,例如数据损坏等。也许我是偏执狂。感谢freadrbindlist 的建议——我以后一定会关注data.table
    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 2015-04-21
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 2010-11-05
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多