J'ai un fichier de données de près de 9 millions de lignes (bientôt plus de 500 millions de lignes) et je cherche le moyen le plus rapide de le lire. Les cinq colonnes alignées sont rembourrées et séparées par des espaces, donc je sais où sur chaque ligne à chercher les deux champs que je veux. routine Mon Python prend 45 secondes:Quel est le moyen le plus rapide de lire dans un grand fichier de données de colonnes de texte?
import sys,time
start = time.time()
filename = 'test.txt' # space-delimited, aligned columns
trans=[]
numax=0
for line in open(linefile,'r'):
nu=float(line[-23:-11]); S=float(line[-10:-1])
if nu>numax: numax=nu
trans.append((nu,S))
end=time.time()
print len(trans),'transitions read in %.1f secs' % (end-start)
print 'numax =',numax
alors que la routine, je suis venu avec dans C est un plus agréable 4 secondes:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define BPL 47
#define FILENAME "test.txt"
#define NTRANS 8858226
int main(void) {
size_t num;
unsigned long i;
char buf[BPL];
char* sp;
double *nu, *S;
double numax;
FILE *fp;
time_t start,end;
nu = (double *)malloc(NTRANS * sizeof(double));
S = (double *)malloc(NTRANS * sizeof(double));
start = time(NULL);
if ((fp=fopen(FILENAME,"rb"))!=NULL) {
i=0;
numax=0.;
do {
if (i==NTRANS) {break;}
num = fread(buf, 1, BPL, fp);
buf[BPL-1]='\0';
sp = &buf[BPL-10]; S[i] = atof(sp);
buf[BPL-11]='\0';
sp = &buf[BPL-23]; nu[i] = atof(sp);
if (nu[i]>numax) {numax=nu[i];}
++i;
} while (num == BPL);
fclose(fp);
end = time(NULL);
fprintf(stdout, "%d lines read; numax = %12.6f\n", (int)i, numax);
fprintf(stdout, "that took %.1f secs\n", difftime(end,start));
} else {
fprintf(stderr, "Error opening file %s\n", FILENAME);
free(nu); free(S);
return EXIT_FAILURE;
}
free(nu); free(S);
return EXIT_SUCCESS;
}
Solutions en Fortran, C++ et Java prendre quantités intermédiaires de temps (27 secondes, 20 secondes, 8 secondes). Ma question est: ai-je fait des aberrations scandaleuses dans le ci-dessus (en particulier le C -code)? Et est-il possible d'accélérer la routine Python? Je me suis vite rendu compte que stocker mes données dans un tableau de tuples valait mieux que d'instancier une classe pour chaque entrée.
S'il vous plaît expliquer les chiffres magiques dans votre code C (d'où venez-vous avec 47 et 858226?) – mikerobi
vous devez exécuter le profileur sur votre code python pour voir où il est lent. Aussi, vous devriez essayer de suivre les conventions de style pep8 pour python, ils le rendent beaucoup plus facile à lire. – Daenyth
Pour python: http://stackoverflow.com/questions/1896674/python-how-to-read-huge-text-text-into-memory – karlphillip