使用并行I/O复制大数据文件
Copy large data file using parallel I/O
我有一个相当大的数据集,大约141M行的。csv格式。我想使用MPI命令与c++来复制和操作一些列,但我是c++和MPI的新手。
到目前为止,我的代码看起来像这样#include <stdio.h>
#include "mpi.h"
using namespace std;
int main(int argc, char **argv)
{
int i, rank, nprocs, size, offset, nints, bufsize, N=4;
MPI_File fp, fpwrite; // File pointer
MPI_Status status;
MPI_Offset filesize;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
MPI_File_get_size(fp, &filesize);
int buf[N];
for (i = 0; i<N; i++)
buf[i] = i;
offset = rank * (N/size)*sizeof(int);
MPI_File_open(MPI_COMM_WORLD, "new.csv", MPI_MODE_RDONLY, MPI_INFO_NULL, &fp);
MPI_File_open(MPI_COMM_WORLD, "Ntest.csv", MPI_MODE_CREATE|MPI_MODE_WRONLY, MPI_INFO_NULL, &fpwrite);
MPI_File_read(fp, buf, N, MPI_INT, &status);
// printf("nrank: %d, buf[%d]: %dn", rank, rank*bufsize, buf[0]);
printf("My rank is: %dn", rank);
MPI_File_write_at(fpwrite, offset, buf, (N/size), MPI_INT, &status);
/* // repeat the process again
MPI_Barrier(MPI_COMM_WORLD);
printf("2/ My rank is: %dn", rank); */
MPI_File_close(&fp);
MPI_File_close(&fpwrite);
MPI_Finalize();
}
我不知道从哪里开始,我已经看到了一些有光泽条纹的例子。如果可能的话,我想去那个方向。其他选项包括HDF5和T3PIO
现在担心光泽条还为时过早,除了光泽条在默认情况下对于"并行文件系统"来说非常小这个事实。使用lfs setstripe
您的第一个挑战将是如何分解这个CSV文件。典型的行是什么样的?如果行是可变长度的,你会有点头疼。原因:
考虑一个有3行和3个MPI进程的CSV文件。
- 一行为
aa,b,c
(8字节)。 - 行为
aaaaaaa,bbbbbbb,ccccccc
(24字节)。 - 第三行是
,,c
(4字节)。
(该死,降价,我怎么让这个列表从0开始?)
Rank 0可以从文件的开头读取,但是Rank 1和Rank 2从哪里开始呢?如果简单地将总大小(8+24+4=36)除以3,则分解为
- 0最终读取
aa,b,cnaaaaaa
, - 1读取
a,bbbbbbb,ccc
, - 读取
ccccn,,cn
非结构化文本输入的两种方法如下。一种选择是对文件进行索引,可以是事后索引,也可以是在文件生成时索引。该索引将存储每行的开始偏移量。Rank 0读取偏移量,然后广播给其他所有人。
第二个选项是按文件大小进行初始分解,然后修复拆分。在上面的简单示例中,排名0将把换行符之后的所有内容发送到排名1。排名1将接收新数据并将其粘贴到其行开头,并将其换行符之后的所有内容发送到排名2。这是非常繁琐的,我不建议刚开始MPI-IO的人使用它。
HDF5在这里是一个很好的选择!与其尝试编写自己的并行CSV解析器,不如让CSV创建器生成HDF5数据集。除其他功能外,HDF5将为您保留我提到的索引,因此您可以设置hyperlabs并进行并行读写。
相关文章:
- 在 C++ AMP 数组中复制数据多少次?
- 字符串是否在其构造函数中复制数据
- 在不复制数据的情况下,将double数组转换为只有double成员的structs数组
- 有没有一种方法可以在不复制数据的情况下从string_view创建字符串流
- 如何在不复制数据的情况下将 cv::Mat 转换为 2d 标准::矢量
- C++ 在节点内存储对数据对象的引用,而不复制数据
- 是否可以在不分配内存或复制数据的情况下构造对象?
- 如何在不复制数据的情况下在平面数组和多维数组之间进行转换?
- C 2D char阵列有时会在随机位置复制数据
- 在不复制数据的情况下更改 opencv mat 中的列顺序
- 有没有办法将 EGL 绘制到 /dev/fb1 而不是 /dev/fb0,而无需在树莓派上复制数据
- 使用C 和目标C从原始图像中复制数据
- 给定 myvector.start() 和 myvector.end(),我想在不复制数据的情况下创建 myvector
- 复制数据时出现奇怪错误
- 如何在 C/C++ 中从数组末尾开始复制数据
- glTexImage2D 复制数据或仅指定数据
- 如何在C++中从void指针复制数据
- 在不复制数据的情况下将OpenCV Mat发送到MATLAB工作区的方法
- 如何使用 GPU-DMA 从 GPU-CUDA 代码来复制数据
- 在矢量到矢量中复制数据<float> <Mat> (Opencv/C++)