2010-04-08 3 views
2

J'ai un fichier txt d'entrée qui a des données sous la forme d'enregistrements (chaque ligne est un enregistrement et représente plus ou moins comme une table DB) et Je dois trouver des valeurs en double. Par exemple:Comment rechercher des valeurs dupliquées dans un énorme fichier texte ayant environ un demi million d'enregistrements

Rec1: ACCOUNT_NBR_1*NAME_1*VALUE_1 
Rec2: ACCOUNT_NBR_2*NAME_2*VALUE_2 
Rec3: ACCOUNT_NBR_1*NAME_3*VALUE_3 

Dans l'ensemble ci-dessus, la Rec1 et Rec2 sont considérés comme des doublons comme les numéros de compte sont les mêmes (ACCOUNT_NBR1). Remarque: Le fichier d'entrée présenté ci-dessus est un fichier de type délimiteur (le délimiteur étant *). Toutefois, le type de fichier peut également être un fichier de longueur fixe dans lequel chaque colonne commence et se termine avec des positions spécifiées.

Je suis en train de faire cela avec la logique suivante:

Loop thru each ACCOUNT NUMBER 
    Loop thru each line of the txt file and record and check if this is repeated. 
    If repeated record the same in a hashtable. 
    End 
End 

Je me sers « modèle » & « BufferedReader » API Java pour exécuter la tâche ci-dessus.

Mais comme cela prend du temps, j'aimerais savoir comment le manipuler.

Merci, Shibu

Répondre

4

Gardez un HashMap de {account_number, occurrences} en mémoire (initialement vide), et parcourir le fichier une seule fois, le réglage ou incrémenter (dans le HashMap) le nombre d'occurrences de chaque numéro de compte que vous rencontrez au cours la traversée.

Si vous avez également d'imprimer des informations complètes sur les numéros de compte en double, puis effectuer une seconde traversal du fichier d'entrée, cette fois l'impression de détails sur chaque numéro de compte où le nombre correspondant d'occurrences dans le HashMap dépassé 1 au cours de la traversal précédent. En termes d'utilisation de la mémoire, même si tous les numéros de compte dans un fichier de ligne 500k sont distincts, vous aurez besoin seulement d'un stockage entier d'environ 1M (en supposant que les numéros de compte sont des entiers) plus HashMap quelques mégaoctets de mémoire.

+0

Merci V, Je étais beaucoup préoccupé par l'utilisation de la mémoire à l'approche ci-dessus, Comme vous le dites, le HashMap avec 500K enregistrements (valeur int) tiendra dans quelques MB de mémoire, ira de l'avant avec cette approche. – Shibu

Questions connexes