2013-08-28 1 views
2

크기가 약 85MB 인 XML 파일을 처리하는 중입니다. 현재 나는 그것을 처리하려고하고있다. 내가하고있는 일은 zip을 다운로드하고, 디스크에 압축을 풀고, XML을 Python Dict로 변환하고, 몇 가지를 변경 한 다음, Dict를 저장하고 MongoDB로 보냅니다.큰 Dict로 작업 할 때 Python - 프로세스가 사라지고 멈춤?

나는이 스크립트를 Ubuntu 13.04 서버가 설치된 VM, 2.6 코어, 4 코어, 16GB RAM 및 1TB 15,000RPM에서 실행하고 있습니다. 본질적으로 파이썬은 7 분 동안 RAM의 12 %를 차지하고 그 다음에 프로세스가 사용률이 높은 목록에서 떨어져 내리고 터미널에서 내 파이프가 움직이지 않으면 서 스크립트를 모니터링하고 있습니다. 나는 CTRL + Z로 그것을 죽이고 "쓰기 실패 : 깨진 파이프"을 반환합니다.

터미널에 인쇄 된 마지막

입니다 xmltodict와 어쩌면 나를 의심 뭔가를 만드는,을 "dailyprice_0505_eur.xml.zip 변환"하지만 솔직히 붙어있어. 데이터가있는 예제 코드는 테스트 해 볼 수있는 사람이라면 누구나 사용할 수 있습니다. 어떤 도움을 주셔서 감사합니다! 감사.

#Importing 
import urllib, xmltodict, os 
from zipfile import ZipFile 

#Getting Working Dir 
abspath = os.path.abspath(__file__) 
root = os.path.dirname(abspath) + "/" 
print "Current Working Directory: " + root 

#Defining 
urlAuth = 'https://dl.dropboxusercontent.com/u/9235267/' 
dailypriceFL = ['dailyprice_0505_eur.xml.zip'] 
dailyPriceDict = {} 

for x in dailyPriceFL: 
    print ' * Downloading',x 
    urllib.urlretrieve(urlAuth+x, x) 

    print ' * Extracting',x 
    with ZipFile(x, "r") as z: 
     z.extractall(root) 

    print ' * Converting',x 
    f = open(root+x.replace(".zip","")) 
    data = xmltodict.parse(f.read()) 
    f.close() 

    print ' * Adding Currency to Dict',x 
    for y in data['prices']['price']: 
     y.update({"currency": x[-7:].replace(".xml","").upper()}) 

    print ' * Ammending',x 
    dailyPriceDict.update(data) 

    print ' * Deleting',x 
    os.remove(root+x) 
    os.remove(root+x.replace(".zip","")) 
    print ' * Finished',x 

답변

0

나와있는 사양에도 불구하고 메모리 오류가 아닌지 궁금합니다. 난 그냥 xml.dom.minidom에서 XML을로드 할 때 나는이 얻을 : 이것은 비록 사물의 내 측면에 작동하는 것처럼 보인다

Traceback (most recent call last): 
    File "c:\python27\lib\xml\dom\minidom.py", line 1930, in parseString 
    return expatbuilder.parseString(string) 
    File "c:\python27\lib\xml\dom\expatbuilder.py", line 940, in parseString 
    return builder.parseString(string) 
    File "c:\python27\lib\xml\dom\expatbuilder.py", line 223, in parseString 
    parser.Parse(string, True) 
    File "c:\python27\lib\xml\dom\expatbuilder.py", line 751, in start_element_handler 
    node = minidom.Element(qname, uri, prefix, localname) 
    File "c:\python27\lib\xml\dom\minidom.py", line 653, in __init__ 
    self._attrs = {} # attributes are double-indexed: 
MemoryError 

: 내 시스템에 거의 800MB 걸립니까

>>> import xmltodict, os 
>>> data = open('price.xml').read() 
>>> xml = xmltodict.parse(data) 
>>> xml['prices']['price'][0] 
OrderedDict([(u'code', u'AD1550.301.1'), 
      (u'startdate', u'2013-08-24'), 
      (u'enddate', u'2013-09-30'), 
      (u'rentalprice', u'126.00'), 
      (u'midweekrentalprice', u'0.00'), 
      (u'weekendrentalprice', u'0.00'), 
      (u'fixprice', u'0.00')]) 

하지만, 나는 실수를하지 않는 것 같습니다. 내가 후 xmltodict 로 구문 분석하려고하면 그러나, 나는 minidom을 사용하려고했습니다, 좀 더 이런 식으로 뭔가를 얻을 : 오히려 직접 모두 expat 기반으로하기 때문에, 무언가가, 제안

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "c:\python27\lib\site-packages\xmltodict.py", line 228, in parse 
    parser.Parse(xml_input, True) 
xml.parsers.expat.ExpatError: out of memory: line 1, column 0 

스크립트 실행 (또는 루프 반복) 사이에서 자유롭게되지 않으면 어떻게 든 리팩토링해야합니다.

관련 문제