繁体   English   中英

使用并行I / O复制大数据文件

[英]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文件。

  1. 一行是aa,b,c (8个字节)。
  2. 行是aaaaaaa,bbbbbbb,ccccccc (24个字节)。
  3. 第三行是,,c (4个字节)。

(darnit,markdown,如何使该列表从零开始?)

可以从文件的开头读取等级0,但是等级1和2将从哪里开始? 如果您简单地将总大小(8 + 24 + 4 = 36)除以3,那么反分解就是

  1. 0最终读取aa,b,c\\naaaaaa
  2. 1读取a,bbbbbbb,ccc
  3. 读取cccc\\n,,c\\n

非结构化文本输入的两种方法如下。 一种选择是在事实之后或在生成文件时为文件建立索引。 该索引将存储每行的起始偏移量。 等级0读取偏移量,然后广播给其他所有人。

第二种选择是按文件大小进行初始分解,然后修复拆分。 在上面的简单示例中,等级0将在换行之后将所有内容发送到等级1。等级1将接收新数据并将其粘贴到其行的开头,并在其自己的换行之后发送所有内容以发送到等级2。我不建议刚开始MPI-IO的人使用它。

HDF5是一个不错的选择! 让您的CSV创建者生成HDF5数据集,而不是尝试编写自己的并行CSV解析器。 HDF5等功能将保留我为您提到的该索引,因此您可以设置超级平板并进行并行读写。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM