По сути, у меня есть XML-файл объемом 6,4 Гбайт, который я бы хотел преобразовать в JSON, а затем сохранить на диск. В настоящее время я запускаю OSX 10.8.4 с i7 2700k и 16GB RAM и запускаю Python 64bit (дважды проверяется). Я получаю сообщение об ошибке, что у меня недостаточно памяти для выделения. Как я могу это исправить?Python - конвертировать очень большие (6.4GB) XML-файлы в JSON
print 'Opening'
f = open('large.xml', 'r')
data = f.read()
f.close()
print 'Converting'
newJSON = xmltodict.parse(data)
print 'Json Dumping'
newJSON = json.dumps(newJSON)
print 'Saving'
f = open('newjson.json', 'w')
f.write(newJSON)
f.close()
Ошибка:
Python(2461) malloc: *** mmap(size=140402048315392) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Traceback (most recent call last):
File "/Users/user/Git/Resources/largexml2json.py", line 10, in <module>
data = f.read()
MemoryError
Try 'readlines' вместо' read'. Метод 'read' возвращает строку, а строка занимает * непрерывное * пространство в памяти, и обычно нет большого (> 100 МБ) непрерывного пространства в доступной памяти. 'readlines' предоставит вам список строк и работает относительно хорошо для больших данных. – Igonato
python имеет тенденцию иметь несколько большие издержки памяти для таких вещей ... например: 'from lxml import etree; e = etree.Element ('x'); e .__ sizeof __() 'возвращает 0x30 - 48 байтов для более или менее пустого элемента. 'd = dict(); d .__ sizeof __() 'возвращает 0xf8. то вы читаете xml и затем воссоздаете его как dict, в основном удваивая его использование памяти. вам нужно будет найти инкрементный метод. –
Одна загадка здесь, почему 'mmap' сообщает, что запрашиваемый размер составляет 140 402 048 315 392. Я, это большой файл, но даже не Python ;-) должен подумать, что для этого ему нужно 140 триллионов байт. –