J'ai une liste de 50 000 ID dans un fichier plat et devez supprimer tous les ID en double. Existe-t-il un algorithme efficace/recommandé pour mon problème?Supprimer les ID en double?
Merci.
J'ai une liste de 50 000 ID dans un fichier plat et devez supprimer tous les ID en double. Existe-t-il un algorithme efficace/recommandé pour mon problème?Supprimer les ID en double?
Merci.
J'ai fait quelques expériences une fois et la solution la plus rapide que j'ai pu obtenir en PHP était de trier les éléments et de supprimer manuellement tous les éléments en double.
Si la performance est pas vraiment un problème pour vous (que je soupçonne, 50 000 est pas tant que ça) que vous pouvez utiliser array_unique()
: http://php.net/array_unique
J'ai couru ceci et il l'a complété dans environ une seconde. Je pensais que ça prendrait plus de temps. Merci. –
@Jamie: L'E/S compliquera probablement le traitement, car la génération d'un ensemble unique aura une complexité algorithmique maximale de n log n, qui est assez rapide, et la plupart des E/S du disque sont très lentes. –
Lire dans un dictionnaire ligne par ligne, en supprimant les doublons. Lorsque tout est lu, écrivez dans un nouveau fichier.
je suppose que si vous avez l'allocation de mémoire suffisamment grande, vous pouvez mettre tous ces ids dans le tableau
$array[$id] = $id;
ceci automatiquement les mauvaises herbes dupes.
Vous pouvez faire:
file_put_contents($file,implode("\n",array_unique(file($file)));
Comment ça marche?
file
qui retourne un tableau.array_unique
file_put_contents
Cette solution suppose que vous avez un ID par ligne dans le fichier plat.
Si vous pouvez utiliser un terminal (ou l'exécution native unix) , le plus simple: (en supposant qu'il n'y a rien d'autre dans le fichier):
sort < ids.txt | uniq > filteredIds.txt
uniq ne fonctionnera que si les identifiants sont consécutifs et les doublons sont les uns à côté des autres. – thetaiko
Bon point; Je pensais que uniq auto-triait: 'sort
Vous pouvez utiliser le programme en ligne de commande sort
pour commander et filtrer la liste des ids. C'est un programme très efficace et évolue bien aussi.
sort -u ids.txt > filteredIds.txt
Vous pouvez le faire via réseau/array_unique, dans cet exemple, je suppose que vos identifiants sont séparés par BRAKS de ligne, si c'est pas le cas juste changer
$file = file_get_contents('/path/to/file.txt');
$array = explode("\n",$file);
$array = array_unique($array);
$file = implode("\n",$array);
file_put_contents('/path/to/file.txt',$file);
Merci pour la réponse complète. J'ai choisi une réponse avant de voir celle-ci. –
@Jamie Redmond ne le transpire pas :) – Hannes
Si vous pouvez simplement exploser la contenu du fichier sur une virgule (ou un délimiteur), alors array_unique produira le code le moins (et le plus propre), sinon si vous analysez le fichier avec le $ array [$ id] = $ id est la solution la plus rapide et la plus propre .
Probablement pas la solution la plus rapide, mais je me suis souvenu de array_unique. Placez-les tous dans un tableau (1 id par élément), utilisez array_unique et écrivez-les dans le fichier. Quelque chose contre ce faisant? –
sont-ils séparés par des sauts de ligne? (\ n)? – Hannes
Oui, ils sont séparés par des sauts de ligne. –