Efficace de la lecture d'un très gros fichier texte en C++

J'ai un très gros fichier texte(45 GO). Chaque ligne du fichier texte contient deux espaces séparés 64 bits entiers non signés, comme illustré ci-dessous.

4624996948753406865 10214715013130414417

4305027007407867230 4569406367070518418

10817905656952544704 3697712211731468838
...
...

Je veux lire le fichier et d'effectuer certaines opérations sur les nombres.

Mon Code en C++:

void process_data(string str)
{
    vector<string> arr;
    boost::split(arr, str, boost::is_any_of(" \n"));
    do_some_operation(arr);
}

int main()
{
    unsigned long long int read_bytes = 45 * 1024 *1024;
    const char* fname = "input.txt";
    ifstream fin(fname, ios::in);
    char* memblock;

    while(!fin.eof())
    {
        memblock = new char[read_bytes];
        fin.read(memblock, read_bytes);
        string str(memblock);
        process_data(str);
        delete [] memblock;
    }
    return 0;
}

Je suis relativement novice en c++. Lorsque j'exécute ce code, je suis confronté à ces problèmes.

  1. À cause de la lecture du fichier en octets, parfois à la dernière ligne d'un bloc correspond à une inachevé ligne dans le fichier d'origine("4624996948753406865 10214" à la place de la chaîne "4624996948753406865 10214715013130414417" du fichier principal).
  2. Ce code fonctionne très très lent. Il faut environ 6secs à exécuter pour un bloc opérations en 64 bits Intel Core i7 920 système avec 6 go de mémoire RAM. Est-il des techniques d'optimisation que je peux utiliser pour améliorer l'exécution?
  3. Est-il nécessaire d'inclure "\n" avec caractère vide dans l'élan fonction split?

J'ai lu sur mmap fichiers en C++, mais je ne suis pas sûr de savoir si c'est la bonne façon de le faire. Si oui, veuillez joindre quelques liens.

À l'aide de eof pas une bonne chose.
Modifier votre question afin de montrer votre compilation de commande (et la version du compilateur & libstdc++)
n'est-il pas plus simple pour enregistrer les données sous forme binaire au lieu de décimales texte mis en forme; j'ai fait quelque chose de similaire dans LabVIEW et a eu comme un facteur de 10 pour l'amélioration de la lecture des fichiers binaires au lieu de l'analyse des fichiers texte (bien sûr cela dépend de l'analyseur de mise en œuvre, mais encore..). Comme un avantage supplémentaire, vous n'auriez pas besoin 20*8=160 octets pour stocker par exemple, le nombre 4624996948753406865 + espace, mais seulement de 8 octets

OriginalL'auteur Pattu | 2014-11-04