[英]Copy large data file using parallel I/O
我有一个相当大的数据集,约有1.41亿行带有.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]: %d\n", rank, rank*bufsize, buf[0]);
printf("My rank is: %d\n", 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: %d\n", 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个字节)。 (darnit,markdown,如何使该列表从零开始?)
可以从文件的开头读取等级0,但是等级1和2将从哪里开始? 如果您简单地将总大小(8 + 24 + 4 = 36)除以3,那么反分解就是
aa,b,c\\naaaaaa
, a,bbbbbbb,ccc
和 cccc\\n,,c\\n
非结构化文本输入的两种方法如下。 一种选择是在事实之后或在生成文件时为文件建立索引。 该索引将存储每行的起始偏移量。 等级0读取偏移量,然后广播给其他所有人。
第二种选择是按文件大小进行初始分解,然后修复拆分。 在上面的简单示例中,等级0将在换行之后将所有内容发送到等级1。等级1将接收新数据并将其粘贴到其行的开头,并在其自己的换行之后发送所有内容以发送到等级2。我不建议刚开始MPI-IO的人使用它。
HDF5是一个不错的选择! 让您的CSV创建者生成HDF5数据集,而不是尝试编写自己的并行CSV解析器。 HDF5等功能将保留我为您提到的该索引,因此您可以设置超级平板并进行并行读写。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.