假设我有 N 个文件,格式如下:
一个文件看起来像这样:
每次都有一些具有不同 id 的数据
- time 1:
- data with id: 10
- data with id: 13
- data with id: 4
- time 2:
- data with id: 10
- data with id: 77
...etc
(每次ID为1-1000的数据都以某种方式(混合)分布在这些N个文件中)
我想合并所有这些 N 个文件,以便我有一个有序的文件:
最终文件:
- time 1:
- data with id: 1
- data with id: 2
- data with id: 3
- ...
- data with id: 1000
- time 2:
- data with id: 1
- data with id: 2
- data with id: 3
- ...
- data with id: 1000
...etc
数据 id 1-1000 的大小约为 100mb,但我有很多次最多占 50 GB 的数据。
我对这个问题的解决方案是这样的,以使其尽可能快:
我在超级计算机节点(例如 24-48 核的 1 台计算机)上使用T 线程(例如)。我已经分配了一个共享内存数组来保存所有 ids 1 - 1000 的数据一次(如果我愿意,也可以更多)
程序:
步骤 1:
- 每个线程都有一些它打开并拥有的文件。然后每个线程将其在文件中的 id 数据填充到共享数组中。
第2步:
- 当所有线程最终处理一次时 --> 线程 1 将这个数组以有序的形式写入最终文件。
阿斯达斯
- 如果这有效,我会非常感兴趣?并行读取是否无论如何都没有顺序化,所以它根本没有用?我可以在具有超快 SSD 的本地计算机或具有网络存储(Lustres 或 Panasas 文件系统)的集群节点上计算最终文件
- 我可以在第 2 步中再次使用所有线程并行写入磁盘,比如说使用 MPI IO(它支持通过偏移量并行写入),或者如何实现?-> C++ 标准库?
感谢您的任何投入!