2010-08-31 4 views
0

J'ai un grand sac de mots tableau (mots, et leur nombre) que j'ai besoin d'écrire dans un grand fichier plat csv.l'écriture de grands fichiers CSV - écrivain CSV dictionnaire semble être le problème

Lors des tests avec environ 1000 ou si les mots, cela fonctionne très bien - j'utiliser le dictwriter comme suit:

self.csv_out = csv.DictWriter(open(self.loc+'.csv','w'), quoting=csv.QUOTE_ALL, fieldnames=fields) 

fields est la liste des mots (ie les clés, dans le dictionnaire que je passe à csv_out.writerow).

Cependant, il semble que la mise à l'échelle soit horrible et que le nombre de mots augmente - le temps requis pour écrire une ligne augmente de façon exponentielle. La méthode dict_to_list en csv semble être l'instigateur de mes ennuis.

Je ne suis pas entièrement sur la façon de commencer même à optimiser ici? des routines CSV plus rapides que je pourrais utiliser?

Répondre

1

L'optimisation évidente consiste à utiliser un csv.writer au lieu d'un DictWriter, en passant en iterables pour chaque ligne à la place des dictionnaires. Est-ce que ça n'aide pas?

Quand vous dites "le nombre de mots", voulez-vous dire le nombre de colonnes dans le fichier CSV? Parce que je n'ai jamais vu un CSV qui a besoin de milliers de colonnes! Peut-être avez-vous transposé vos données et écrit des colonnes au lieu de lignes? Chaque ligne doit représenter une donnée, avec des sections définies par les colonnes. Si vous avez vraiment besoin de ce genre de taille, peut-être qu'une base de données est un meilleur choix?

+0

bien - thats ce que je faisais au début, et il rend le code beaucoup messier, juste la façon dont il est en ce moment - ce serait vraiment le dernier recours. * Mise à jour: * c'est un sac d'analyse de mots destiné à R - Je dois créer une colonne pour chaque mot qu'il rencontre ... – Malang

+0

@Malang: "Je dois créer une colonne pour chaque mot qu'il rencontre" . Si c'est votre exigence, pourquoi l'ajout de colonnes (ainsi que de lignes) vous dérange-t-il? Clairement, c'est ** O ** (n * m) et ça ne va pas bien évoluer. Quelle est votre question? –

+0

bien - son fait presque intraitable de calcul, et j'espérais qu'il y avait quelques avenues pour l'optimisation ... – Malang

2

Ok, ceci est nullement la réponse mais je regardé le code source pour le module csv et remarqué qu'il ya un chèque if not très cher dans le module (§ 136-141 en python 2.6).

if self.extrasaction == "raise": 
    wrong_fields = [k for k in rowdict if k not in self.fieldnames] 
    if wrong_fields: 
     raise ValueError("dict contains fields not in fieldnames: " + 
         ", ".join(wrong_fields)) 
return [rowdict.get(key, self.restval) for key in self.fieldnames] 

donc une solution rapide semble passer extrasaction="ignore" lors de la création de l'écrivain. Cela semble accélérer les choses très sensiblement.

pas une solution parfaite, et peut-être un peu évident, mais simplement poster il est utile à quelqu'un d'autre ..