Я пытаюсь сериализовать список словарей в текстовый файл csv с помощью модуля CSV Python. В моем списке около 13 000 элементов, каждый из которых - словарь с ~ 100 ключами, состоящими из простого текста и цифр. Моя функция «dictlist2file» просто вызывает DictWriter для сериализации этого, но я получаю ошибки в памяти.Как эффективно выводить словарь как файл csv с помощью модуля csv Python? Ошибка в памяти
Моя функция:
def dictlist2file(dictrows, filename, fieldnames, delimiter='\t',
lineterminator='\n', extrasaction='ignore'):
out_f = open(filename, 'w')
# Write out header
if fieldnames != None:
header = delimiter.join(fieldnames) + lineterminator
else:
header = dictrows[0].keys()
header.sort()
out_f.write(header)
print "dictlist2file: serializing %d entries to %s" \
%(len(dictrows), filename)
t1 = time.time()
# Write out dictionary
data = csv.DictWriter(out_f, fieldnames,
delimiter=delimiter,
lineterminator=lineterminator,
extrasaction=extrasaction)
data.writerows(dictrows)
out_f.close()
t2 = time.time()
print "dictlist2file: took %.2f seconds" %(t2 - t1)
Когда я попробовать это на моем словаре, я получаю следующий результат:
dictlist2file: serializing 13537 entries to myoutput_file.txt
Python(6310) malloc: *** mmap(size=45862912) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Traceback (most recent call last):
...
File "/Library/Frameworks/Python.framework/Versions/6.2/lib/python2.6/csv.py", line 149, in writerows
rows.append(self._dict_to_list(rowdict))
File "/Library/Frameworks/Python.framework/Versions/6.2/lib/python2.6/csv.py", line 141, in _dict_to_list
return [rowdict.get(key, self.restval) for key in self.fieldnames]
MemoryError
Любая идея, что может быть причиной этого? Список содержит всего 13 000 элементов, а сами словари очень простые и маленькие (100 ключей), поэтому я не понимаю, почему это приведет к ошибкам памяти или будет настолько неэффективным. Для получения ошибки памяти требуется несколько минут.
благодарит за вашу помощь.
Использование: для строки в dictrows: данные.writerow (row) не имеет значения. Я не понимаю, почему проблема памяти - это всего 13 000 словарей, и каждый из них по-прежнему довольно мал и вообще не вложен. Он содержит только строки и числа ... есть ли альтернатива модулю csv, который менее медленный? – user248237dfsf