Скопируйте большой файл данных с помощью параллельного ввода-вывода

У меня довольно большой набор данных, около 141 млн строк в формате .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.


person kensaii    schedule 29.07.2015    source источник


Ответы (1)


Вам слишком рано беспокоиться о глянцевых полосах, если не считать того факта, что глянцевые полосы по умолчанию являются чем-то смехотворно маленьким для «параллельной файловой системы». Увеличьте размер полосы каталога, в котором вы будете писать и читать эти файлы, с помощью lfs setstripe

Ваша первая задача будет заключаться в том, как разложить этот CSV-файл. Как выглядит типичный ряд? Если строки имеют переменную длину, у вас может возникнуть небольшая головная боль. Вот почему:

рассмотрим файл CSV с 3 строками и 3 процессами MPI.

  1. Одна строка - aa,b,c (8 байтов).
  2. строка aaaaaaa,bbbbbbb,ccccccc (24 байта).
  3. третья строка - ,,c (4 байта).

(черт возьми, уценка, как мне заставить этот список начинаться с нуля?)

Ранг 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, попросите создателя CSV сгенерировать набор данных HDF5. HDF5, среди других функций, сохранит тот индекс, который я упомянул для вас, так что вы можете настроить гиперлаборатории и выполнять параллельное чтение и запись.

person Rob Latham    schedule 30.07.2015
comment
+1; вы можете работать с текстовыми файлами таким образом (например, этот ответ здесь), но текст является паршивый способ работы с большими объемами числовых данных, как указывает Роб Лэтэм; это также намного медленнее. Файлы CSV очень хорошо отображаются на таблицы HDF5, или вы можете просто использовать 2d массив в виде набора данных HDF5, если все столбцы одного типа. Если вычислений не так много, и вы знаете какой-нибудь Python, h5py подойдет вам. приятнее, чем интерфейс HDF5 C. - person Jonathan Dursi; 30.07.2015
comment
спасибо, Роб и Джонатан! Я хочу показать вам, ребята, но у меня недостаточно репутации. произвольная строка содержит 5 значений, но может быть отрицательной или положительной, поэтому деление по размеру невозможно. Я попробую hdf5, это перспективное решение. еще раз спасибо - person kensaii; 31.07.2015