2009-10-07 7 views
0

J'ai une application qui analyse les données des fichiers d'entrée générés par notre système principal. Selon le client, la taille de ce fichier peut varier (les fichiers contiennent des statistiques de marketing en ligne telles que les clics, les impressions, etc.). Un de nos clients a un site Web qui génère un volume de trafic assez important et les fichiers de métriques générés ont une taille d'environ 3-4 mégaoctets. Cette application analyse actuellement trois fichiers à la fois, chaque fichier étant un agrégat temporel différent. Je lis dans le fichier en utilisant un itérateur CSV, et il stocke le contenu du fichier entier dans un tableau multi-dimensionnel. Le tableau pour l'un des fichiers particuliers est long d'environ 16000 éléments, chaque sous-tableau étant de 31 éléments. L'objet dataprocessor qui gère le chargement de ces données utilise environ 50 Mo de mémoire. Actuellement, la limite de la mémoire PHP est fixée à 100 Mo. Malheureusement, le serveur de cette application est ancien et ne peut pas gérer une grande partie de l'augmentation de la mémoire. Cela m'amène à la question suivante: comment puis-je optimiser le traitement d'un fichier de cette taille?Utilisation importante de la mémoire sur un petit serveur (Question d'optimisation)

Une optimisation possible peut-elle être lue dans certaines parties du fichier, calculer, stocker, répéter?

Répondre

0

Vous êtes sur la bonne voie. Dans la mesure du possible, lisez une ligne, faites ce que vous devez faire (en comptant tout ce que vous comptez, etc.), puis jetez la ligne.

Voir l'exemple pour fgets()

0

Pourquoi ne pas lire simplement la ligne de fichiers en ligne ... -> lire la ligne -> magasin ce que vous avez besoin, mettez à jour vos statistiques -> lire la ligne suivante, etc.

1

Vous pouvez modifier CSVIterator et lire des parties du fichier à la fois ou une ligne à la fois.

$handle = fopen("/tmp/inputfile.txt", "r"); 
if ($handle) { 
    while(!feof($handle)){ 
    $buffer = fread($handle, 4096); 
    echo $buffer; 
    } 
} 

ou

$handle = fopen("/tmp/inputfile.txt", "r"); 
if ($handle) { 
    while (!feof($handle)) { 
    $buffer = fgets($handle, 4096); 
    echo $buffer; 
    } 
    fclose($handle); 
} 
Questions connexes