Comment comparer des fichiers texte volumineux?

J'ai une question d'ordre général sur votre avis au sujet de ma "technique".

Il y a 2 fichiers texte (file_1 et file_2) qui doivent être comparés les uns aux autres. Les deux sont très gros (3 à 4 giga-octets, à partir de 30 000 000 à 45 000 000 de lignes de chaque).
Mon idée est de lire plusieurs lignes (autant que possible) de file_1 de la mémoire, puis de comparer ces tous lignes de file_2. Si il y a un match, les lignes de deux fichiers qui correspondent doit être écrit dans un nouveau fichier. Ensuite, allez sur les 1000 lignes de file_1 et aussi de comparer ces tous lignes de file_2 jusqu'à ce que je suis allé à travers file_1 complètement.

Mais cela semble vraiment très, très fastidieux et compliqué pour moi.
Pouvez-vous penser à d'autres méthode pour comparer ces deux fichiers?

Combien de temps pensez-vous de la comparaison pourrait prendre?
Pour mon programme, le temps n'a pas beaucoup d'importance. Je n'ai aucune expérience dans le travail avec des fichiers énormes, donc je n'ai aucune idée de combien de temps cela pourrait prendre. Il ne devrait pas prendre plus d'une journée. 😉 Mais j'ai peur que mon technique pourrait prendre une éternité...

Antoher question qui vient à l'esprit: combien de lignes que vous lisez dans la mémoire? Autant que possible? Est-il un moyen de déterminer le nombre de lignes possibles avant de l'essayer?
Je veux en lire autant que possible (parce que je pense que c'est plus rapide), mais j'ai manqué de mémoire assez souvent.

Merci d'avance.

MODIFIER
Je pense que je dois expliquer mon problème un peu plus.

Le but n'est pas de voir si les deux fichiers sont en général identiques (ils ne le sont pas).
Il y a quelques lignes dans chaque fichier qui partagent les mêmes "caractéristiques".
Voici un exemple:
file_1 ressemble un peu à ceci:

mat1 1000 2000 TEXT      //this means the range is from 1000 - 2000
mat1 2040 2050 TEXT
mat3 10000 10010 TEXT
mat2 20 500 TEXT

file_2ressemble à ceci:

mat3 10009 TEXT
mat3 200 TEXT
mat1 999 TEXT

TEXT se réfère aux chiffres et caractères qui ne sont d'aucun intérêt pour moi, mat peut aller de mat1 - mat50 et sont dans aucun ordre; il peut aussi y avoir 1000x mat2 (mais les chiffres dans la colonne suivante sont différents). J'ai besoin de trouver le raccord des lignes de manière à: matX est le même dans les deux lignes par rapport à un le nombre mentionné dans file_2 s'inscrit dans la plage mentionnée dans file_1.
Donc, dans mon exemple je voudrais trouver un match: la ligne 3 de file_1et la ligne 1 de file_2 (parce que les deux sont mat3 et 10009 est compris entre 10 000 et 10010).
J'espère de ce fait, il est clair pour vous!

Donc ma question est: comment voulez-vous de recherche pour la mise en correspondance de lignes?

Oui, je utiliser Java comme mon langage de programmation.

MODIFIER
J'ai maintenant divisé les fichiers de grande première, de sorte que je n'ai pas de problèmes de mémoire. Je pense aussi que c'est plus rapide de comparer les (nombreuses) des fichiers plus petits les uns des autres que ces deux fichiers énormes. Après ce que je peux comparer la façon dont je l'ai mentionné ci-dessus. Il peut ne pas être la manière parfaite, mais je suis encore à apprendre 😉
Mais tous vos approches ont été très utile pour moi, merci pour vos réponses!

Vous tagged la question avec java cela veut-il dire que vous ne voulez le faire en Java?
Je ne sais pas si cela peut vous aider stackoverflow.com/questions/964332/...
Sonne comme un bon cas d'utilisation pour le mappage de mémoire (et de défragmenter vos fichiers en premier), mais je ne sais pas si Java propose que.
Pas sûr de comprendre votre condition. Avez-vous besoin de trouver des lignes qui sont en commun entre les deux fichiers? Ou êtes-vous vraiment essayer de faire une diff?
Dans ce cas, vous prétraiter file_2 de sorte que vous avez 50 structures de données (mat1..mat50) chacune avec une série de plages commandé par la limite inférieure de sorte que vous pouvez faire une recherche binaire sur elle. Ne devrait pas prendre plus de 1 go pour 40.000.000 lignes. Ensuite, passez par file_1 de façon séquentielle et chercher chaque ligne.

OriginalL'auteur Grrace | 2011-08-18