L'enregistrement d'énormes bigram dictionnaire de fichier à l'aide de cornichon

un ami à moi qui a écrit ce petit programme.
le textFile est de 1,2 GO en taille (7 ans d'une valeur de journaux).
Il gère avec succès pour créer le dictionnaire, mais il ne peut pas écrire dans un fichier en utilisant cornichon(programme se bloque).

import sys
import string
import cPickle as pickle

biGramDict = {}

textFile = open(str(sys.argv[1]), 'r')
biGramDictFile = open(str(sys.argv[2]), 'w')


for line in textFile:
   if (line.find('<s>')!=-1):
      old = None
      for line2 in textFile:
         if (line2.find('</s>')!=-1):
            break
         else:
            line2=line2.strip()
            if line2 not in string.punctuation:
               if old != None:
                  if old not in biGramDict:
                     biGramDict[old] = {}
                  if line2 not in biGramDict[old]:
                     biGramDict[old][line2] = 0
                  biGramDict[old][line2]+=1
               old=line2

textFile.close()

print "going to pickle..."    
pickle.dump(biGramDict, biGramDictFile,2)

print "pickle done. now load it..."

biGramDictFile.close()
biGramDictFile = open(str(sys.argv[2]), 'r')

newBiGramDict = pickle.load(biGramDictFile)

merci d'avance.

MODIFIER

pour toute personne intéressée, je vais vous expliquer brièvement ce que ce programme n'.
en supposant que vous avez un fichier formaté à peu près comme ceci:

<s>
Hello
,
World
!
</s>
<s>
Hello
,
munde
!
</s>
<s>
World
domination
.
</s>
<s>
Total
World
domination
!
</s>
  • <s> sont des phrases séparateurs.
  • un mot par ligne.

un biGramDictionary est généré pour une utilisation ultérieure.

quelque chose comme ceci:

{
 "Hello": {"World": 1, "munde": 1}, 
 "World": {"domination": 2},
 "Total": {"World": 1},
}

espère que cette aide. actuellement, la stratégie a changé à l'aide de mysql parce que sqlite ne fonctionnait pas (probablement à cause de la taille)

si vous allez jouer avec les GROS fichiers, pourquoi ne pas utiliser une base de données? aussi, je vois que vous faites pour une boucle sur le même fichier 2 fois, ce qui peut être superflu et ajoute au coût de traitement. pourquoi ne pas décrire ce que vous faites avec des exemples de fichiers d'entrée ?
ghostdog74, à vous de voir 2 pour les déclarations, mais il y a une seule boucle sur le fichier 🙂 de parcourir un fichier est juste la lecture des lignes (à partir de la position réelle), il ne cherche pas à le début du fichier.
Tout simplement essayer de sqlitedict (votre Python dict soutenu par la DB sur le disque, pas de RAM).

OriginalL'auteur João Portela | 2010-01-21