2017-10-05 2 views
0
with open(files, "rb") as f: 
    reader = csv.reader(f, delimiter=",") 
    totalTweets = 0 
    for i, line in enumerate(reader): 
     totalTweets += 1 
     hashtagsArr = re.findall(r"#(\w+)", line[2]) 
     for eachHashtag in hashtagsArr: 
      hashtagsArr.append(eachHashtag) 

Pourquoi la boucle for génère-t-elle une erreur de mémoire pour les fichiers csv volumineux? Je suis simplement itérer un grand fichier csv.Pour la génération de boucle MemoryError

+6

Vous ajoutez de nouveaux hashtags à la même liste de hashtags que vous itérez. Cela, pour moi, ressemble à une boucle sans fin: 'pour chaque hashtag dans hashtagsArr: hashtagsArr.append (eachHashtag)' ne peut jamais se terminer. – Abdou

Répondre

2

Regardez la dernière boucle:

for eachHashtag in hashtagsArr: 
    hashtagsArr.append(eachHashtag) 

hashtagsArr pousse sur un élément à chaque itération, de sorte que cette boucle ne se rompt jamais correctement. Lorsque le tableau est devenu trop grand pour être stocké dans la mémoire, MemoryError a été levé.

Sinon, votre code semble correct, énumérer paresseusement par itération de sorte qu'il ne lit pas tout le contenu du fichier dans la mémoire lors du premier appel.

Si vous devez enregistrer tous les hashtags en une seule liste, vous pouvez modifier votre code comme suit:

hashtags=[] 
with open(files, "rb") as f: 
    reader = csv.reader(f, delimiter=",") 
    totalTweets = 0 
    for i, line in enumerate(reader): 
     totalTweets += 1 
     hashtagsArr = re.findall(r"#(\w+)", line[2]) 
     hashtags += hashtagsArr 
0

votre code modifié correct

newhashtagarr=[] 
with open(files, "rb") as f: 
    reader = csv.reader(f, delimiter=",") 
    totalTweets = 0 
    for i, line in enumerate(reader): 
     totalTweets += 1 
     hashtagsArr = re.findall(r"#(\w+)", line[2]) 
     for eachHashtag in hashtagsArr: 
      newhashtagarr.append(eachHashtag) 

1
for eachHashtag in hashtagsArr: 
    hashtagsArr.append(eachHashtag) 

Cela équivaut à dire pour chaque oeuf dans mon panier, ajoutez cet oeuf au panier. C'est une boucle qui ne se terminera jamais parce que vous ajoutez les oeufs au panier au même rythme que vous les enlevez. Vous devez créer une nouvelle variable pour contenir des données hashtag, vous pouvez l'appeler "newHashtagArr" mais cela n'a pas d'importance.

newHashtagArr = [] 
for eachHashtag in hashtagsArr: 
    newHashtagArr.append(eachHashtag)