J'ai un fichier csv avec les enregistrements en cours de tri sur le premier champ. J'ai réussi à générer une fonction qui effectue une recherche binaire à travers ce fichier, en utilisant fseek pour un accès aléatoire par fichier.fichier php accès aléatoire et objet à enregistrer fichier
Cependant, c'est encore un processus assez lent, puisque lorsque je cherche une position de fichier, j'ai vraiment besoin de regarder à gauche, à la recherche de \ n caractère, afin que je puisse lire toute une ligne la ligne est lue, je peux vérifier la première valeur de champ mentionnée ci-dessus).
Voici la fonction qui renvoie une ligne qui contient le caractère à la position x:
function fgetLineContaining($fh, $x) {
if($x 125145411) // 12514511 is the last pos in my file
return "";
// now go as much left as possible, until newline is found
// or beginning of the file
while($x > 0 && $c != "\n" && $c != "\r") {
fseek($fh, $x);
$x--; // go left in the file
$c = fgetc($fh);
}
$x+=2; // skip newline char
fseek($fh, $x);
return fgets($fh, 1024); // return the line from the beginning until \n
}
Bien que cela fonctionne comme prévu, je dois triste que mon fichier csv a ~ lignes de 1.5mil, et ces recherches de gauche ralentissent à peu près.
Existe-t-il un meilleur moyen de rechercher une ligne contenant la position x dans un fichier?
De même, il serait préférable qu'un objet d'une classe puisse être sauvegardé dans un fichier sans le sérialiser, permettant ainsi la lecture d'un fichier objet par objet. Est-ce que php supporte cela?
Merci
également, une autre idée m'est venue à l'esprit - que diriez-vous de l'échantillonnage d'un fichier - prendre une entrée pour 1000 entrées du fichier et le stocker dans le tableau. cela produirait 1500 array d'éléments, que je pourrais rechercher binaire, obtenant l'approximation approximative où la ligne désirée est. Je pourrais alors charger les 1000 éléments restants et faire une recherche binaire sur eux. est-ce que ça fait la même chose? – hummingBird
Quel genre de recherches effectuez-vous sur ce fichier? Est-ce que le fichier change fréquemment? Si vous effectuez de nombreuses recherches sur le même fichier, il peut être beaucoup plus rapide de simplement charger les données dans une base de données SQLite et de rechercher dans la base de données. – kijin
Si vous connaissez la longueur d'une ligne moyenne, vous pouvez simplement revenir en arrière et faire 'fgets()' pour aligner le pointeur avec la fin de la ligne précédente, ou quelques lignes avant cela. Devrait être assez bon dans le but de la recherche binaire. – kijin