grep -f alternative pour les gros fichiers
grep -F -f file1 file2
fichier1 est de 90 Mo (2,5 millions de lignes, en un mot par ligne)
fichier2 est de 45 Go
Que la commande n'a pas fait de produire quoi que ce soit, peu importe combien de temps je laisse courir. Clairement, c'est au-delà de grep.
Il semble grep ne peut pas gérer de nombreuses requêtes de la -f
option. Toutefois, la commande suivante ne produire le résultat désiré:
head file1 > file3
grep -F -f file3 file2
J'ai des doutes quant à savoir si sed ou awk serait de solutions de rechange appropriées, compte tenu de la taille du fichier.
Je suis à une perte pour des alternatives... s'il vous plaît aider. Est-il utile d'apprendre quelques sql
commandes? Est-il facile? Quelqu'un peut me pointer dans la bonne direction?
split
de commande pour briser fichier1 en morceaux?Les commandes SQL ne sera pas généralement vous aider avec des fichiers raw.
si il a divisé le fichier de modèle en 100 pc, il a de jouer avec les 45G de monster 100 fois..c'est ok...**ET** il doit supprimer dupliqué appariés lignes. depuis grep -f signifie "OU".... Je ne sais pas si c'est plus rapide.
quel système d'exploitation êtes-vous sur? Mon expérience avec
grep -F -f listFile
est que vous obtenez un message d'erreur disant listFile too big
(ou similaire). Hm... d'Autres lecteurs... N'est-ce pas là quelque chose à propos de -f listFile
être un fichier trié? ? Aussi, bien que SQL pourrait résoudre ce problème, il y aura un hugh moment de l'installation de SQL installé, cfged, etc. Si votre faire un processus de production qui fonctionnent régulièrement, il peut être vaut l'investissement en temps, mais sans doute pas dans le calendrier de votre projet. Bonne chance!Il vous suffit de faire cat fichier2, parce que si vous grep hors de 2,5 millions de mots à partir d'un fichier, presque toutes les lignes vont apparaître avec le temps 🙂
OriginalL'auteur cmo | 2013-05-02
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser LC_ALL=C . Il tourne la recherche de modèle à partir de l'UTF-8 pour l'ASCII, ce qui accélère par 140 fois la vitesse d'origine. J'ai un 26G fichier qui va me prendre environ 12 heures pour faire le bas pour un couple de minutes.
Source: Grepping un énorme fichier (80 GO) de toute façon pour l'accélérer?
Donc ce que je fais est:
OriginalL'auteur Mojing Liu
Je ne pense pas qu'il y est une solution de facilité.
Imaginez que vous écrivez votre propre programme qui fait ce que vous voulez et vous allez vous retrouver avec une boucle imbriquée, où la boucle externe effectue une itération sur les lignes dans fichier2 l'intérieur de la boucle itère sur fichier1 (ou vice versa). Le nombre d'itérations augmente avec
size(file1) * size(file2)
. Ce sera un très grand nombre lorsque les deux fichiers sont volumineux. Faire un fichier plus petit à l'aide dehead
apparemment résout ce problème, au prix de ne pas donner le résultat correct plus.Une voie de sortie est de l'indexation (ou tri) d'un des fichiers. Si vous parcourez fichier2 et pour chaque mot, vous pouvez déterminer si oui ou non il est dans le fichier de modèle sans complet parcourir le fichier de modèle, alors vous êtes beaucoup mieux. Cela suppose que vous avez un mot-par-mot de comparaison. Si le fichier de modèle contient non seulement les mots, mais aussi des sous-chaînes, alors cela ne fonctionnera pas, parce que, pour un mot donné dans fichier2 vous ne savez pas quoi chercher dans fichier1.
L'apprentissage du SQL est certainement une bonne idée, parce que l'apprentissage de quelque chose est toujours bon. Il hovever, de ne pas résoudre votre problème, parce que SQL va souffrir de la même quadratique effets décrits ci-dessus. Il peut simplifier l'indexation, l'indexation devrait être applicable à votre problème.
Votre meilleur pari est probablement prendre un peu de recul et de repenser votre problème.
OriginalL'auteur Martin Drautzburg
Vous pouvez essayer ack. Ils disent que c'est plus rapide que grep.
Vous pouvez essayer en parallèle :
Parallèle a beaucoup d'autres commutateurs pour faire des calculs plus rapides.
OriginalL'auteur Sidharth C. Nadhan
Grep ne peut pas gérer de nombreuses questions, et à ce volume, il ne sera pas aidé par la fixation de la
grep -f
bug qui le rend si insupportablement lent.Sont à la fois fichier1 et fichier2 composé d'un seul mot par ligne? Cela signifie que vous êtes à la recherche pour les correspondances exactes, nous pouvons le faire très rapidement avec
awk
:NR (nombre de dossiers, le numéro de la ligne) n'est égale qu'à la FNR (fichier spécifique nombre d'enregistrements) pour le premier fichier, où nous remplir de la table de hachage, puis passer à la ligne suivante. La deuxième clause de vérifications de l'autre fichier(s) pour savoir si la ligne correspond à celui enregistré dans notre base de hachage, puis imprime les lignes correspondants.
Sinon, vous aurez besoin pour effectuer une itération:
Au lieu de se contenter de vérification du hachage, nous avons à parcourir chaque requête et voir si elle correspond à la ligne actuelle (
$0
). C'est beaucoup plus lent, mais malheureusement nécessaire (bien que nous sommes au moins d'appariement de la plaine des chaînes sans utiliser les regexes, de sorte qu'il pourrait être plus lent). La boucle s'arrête quand on a un match.Si vous avez réellement voulu évaluer les lignes du fichier de requête que les expressions régulières, vous pouvez utiliser
$0 ~ q
au lieu de la plus rapideindex($0, q)
. Notez que cela utilise POSIX étendue des expressions régulières, à peu près le même quegrep -E
ouegrep
mais sans délimitée quantificateurs ({1,7}
) ou le GNU extensions pour les limites de mot (\b
) et abréviation classes de personnage (\s
,\w
, etc).Ceux-ci devraient travailler aussi longtemps que le hachage de ne pas dépasser les limites de ce
awk
peut stocker. Cela pourrait être aussi bas que 2.1 B entrées (une supposition basée sur la plus haute signé 32 bits int) ou aussi haut que la quantité de mémoire libre.OriginalL'auteur Adam Katz