traitement de fichiers texte très rapide (C ++)

j'ai écrit une application qui traite les données sur le GPU. Le Code fonctionne bien, mais j'ai le problème que la partie lecture du fichier d'entrée (~3 GO, texte) est le goulot d'étranglement de ma demande. (La lecture depuis le disque dur est rapide, mais le traitement ligne par ligne est lent).

J'ai lu une ligne avec getline() et copiez la ligne 1 à un vecteur, line2 à un vecteur et ignorer les lignes 3 et 4. Et ainsi de suite pour le reste de l'11 mio lignes.

J'ai essayé plusieurs approches pour obtenir le fichier au meilleur moment possible:

Méthode la plus rapide que j'ai trouvé est d'utiliser boost::iostreams::stream

D'autres ont été:

  • Lire le fichier que gzip, afin de minimiser les IO, mais est plus lent que directement
    en le lisant.
  • de copier le fichier ram en lecture(filepointer, chararray, longueur)
    et le traiter avec une boucle de distinguer les lignes (plus lent que la boost)

Des suggestions pour le rendre plus rapide?

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::stream<boost::iostreams::file_source>ins(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++;
        }
    }

EDIT:

La source, le fichier est téléchargeable sous https://docs.google.com/open?id=0B5bvyb427McSMjM2YWQwM2YtZGU2Mi00OGVmLThkODAtYzJhODIzYjNhYTY2

J'ai changé la fonction readfastq pour lire le fichier, à cause de quelques problèmes avec le pointeur. Donc, si vous appelez readfastq la blocksize (en ligne) doit être plus grand que le nombre de lignes à lire.

SOLUTION:

J'ai trouvé une solution, qui obtenir le temps pour lire dans le fichier de 60sec à 16 sec. J'ai enlevé l'intérieur de la boucle qui handeles les caractères spéciaux et de faire cela dans le GPU. Cela diminue la lecture dans le temps et seulement une augmentation minime de la GPU de temps de fonctionnement.

Merci pour vos suggestions.

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::stream<boost::iostreams::file_source>file(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++;
        }
    }
}

source d'informationauteur mic