En PHP, j'utilise fopen()
, , et fclose()
pour lire un fichier ligne par ligne. Ça marche bien. Mais j'ai un script (exécuté à partir de la CLI) qui doit traiter trois centaines de fichiers texte de 5 Go. C'est environ 3 milliards fgets()
. Donc, cela fonctionne assez bien, mais à cette échelle, les économies de vitesse minuscules vont s'accumuler extrêmement vite. Alors je me demande s'il y a des astuces pour accélérer le processus?Manière plus rapide de lire le fichier ligne par ligne?
La seule chose à laquelle je pensais était d'obtenir fgets()
pour lire plus d'une ligne à la fois. Il ne semble pas que cela prenne en charge cela, mais je pourrais en théorie dire 20 consécutifs $line[] = fgets($file);
puis traiter le tableau. Ce n'est pas tout à fait la même chose que de lire plusieurs lignes dans une même commande, cela n'a donc aucun effet. Mais je sais mettre en file d'attente vos insertions mysql et les envoyer comme un insert géant (une autre astuce que je vais mettre en œuvre dans ce script après plus de tests et de benchmarking) permettra d'économiser beaucoup de temps.
Vous pourriez essayer de le lire "buffer by buffer" et de regrouper les lignes splitées – modsfabio
Avez-vous essayé d'utiliser la fonction fgetcsv? –
mmap ou createfilemapping pour le script PHP sera utile https://github.com/calcinai/php-mmap – tommybee