очень быстрая обработка текстовых файлов (C ++)

Я написал приложение, которое обрабатывает данные на графическом процессоре. Код работает хорошо, но у меня проблема в том, что часть чтения входного файла (~ 3 ГБ, текст) является узким местом моего приложения. . (Чтение с жесткого диска происходит быстро, но обработка строка за строкой происходит медленно.)

Я читаю строку с помощью getline () и копирую строку 1 в вектор, строку 2 в вектор и пропускаю строки 3 и 4. И так далее для остальных 11 миллионов строк.

Я пробовал несколько подходов, чтобы получить файл в наилучшее возможное время:

Самый быстрый метод, который я нашел, - это использование boost :: iostreams :: stream

Другие были :

  • Прочтите файл как gzip, чтобы минимизировать ввод-вывод, но это медленнее, чем прямое его чтение.
  • копирование файла в оперативную память путем чтения (указатель файла, chararray, длина) и обработка он с циклом для различения строк (также медленнее, чем ускорение)

Есть предложения, как заставить его работать быстрее?

void readfastq(char *filename, int SRlength, uint32_t blocksize){
    _filelength = 0; //total datasets (each 4 lines)
    _SRlength = SRlength; //length of the 2. line
    _blocksize = blocksize;

    boost::iostreams::streamins(filename);
    in = ins;

    readNextBlock();
}


void readNextBlock() {
    timeval start, end;
    gettimeofday(&start, 0);

    string name;
    string seqtemp;
    string garbage;
    string phredtemp;

    _seqs.empty();
    _phred.empty();
    _names.empty();
    _filelength = 0;

            //read only a part of the file i.e the first 4mio lines
    while (std::getline(in, name) && _filelength<_blocksize) {
        std::getline(in, seqtemp);
        std::getline(in, garbage);
        std::getline(in, phredtemp);

        if (seqtemp.size() != _SRlength) {
            if (seqtemp.size() != 0)
                printf("Error on read in fastq: size is invalid\n");
        } else {
            _names.push_back(name);

            for (int k = 0; k < _SRlength; k++) {

                //handle special letters
                                    if(seqtemp[k]== 'A') ...
                                    else{
                _seqs.push_back(5);
                                    }

            }
            _filelength++;
        }
    }

РЕДАКТИРОВАТЬ:

Исходный файл можно загрузить в https: // docs. google.com/open?id=0B5bvyb427McSMjM2YWQwM2YtZGU2Mi00OGVmLThkOD AtYzJhODIzYjNhYTY2

Я изменил функцию readfastq для чтения файла из-за некоторых проблем с указателем. Поэтому, если вы вызываете readfastq , размер блока (в строках) должен быть больше, чем количество строк для чтения.

РЕШЕНИЕ:

Я нашел решение, которое позволяет получить время чтения в файле с 60 до 16 секунд.Я удалил внутренний цикл, который обрабатывает специальные символы, и сделал это в графическом процессоре. Это уменьшает время чтения и лишь минимально увеличивает время работы графического процессора.

Спасибо за ваши предложения.

void readfastq(char *filename, int SRlength) {
    _filelength = 0;
    _SRlength = SRlength;

    size_t bytes_read, bytes_expected;

    FILE *fp;
    fp = fopen(filename, "r");

    fseek(fp, 0L, SEEK_END); //go to the end of file
    bytes_expected = ftell(fp); //get filesize
    fseek(fp, 0L, SEEK_SET); //go to the begining of the file

    fclose(fp);

    if ((_seqarray = (char *) malloc(bytes_expected/2)) == NULL) //allocate space for file
        err(EX_OSERR, "data malloc");


    string name;
    string seqtemp;
    string garbage;
    string phredtemp;

    boost::iostreams::streamfile(filename);


    while (std::getline(file, name)) {
        std::getline(file, seqtemp);
        std::getline(file, garbage);
        std::getline(file, phredtemp);

        if (seqtemp.size() != SRlength) {
            if (seqtemp.size() != 0)
                printf("Error on read in fastq: size is invalid\n");
        } else {
            _names.push_back(name);

            strncpy( &(_seqarray[SRlength*_filelength]), seqtemp.c_str(), seqtemp.length()); //do not handle special letters here, do on GPU

            _filelength++;
        }
    }
}

10
задан mic 18 November 2011 в 07:41
поделиться