2011-08-02 6 views
0

데이터를리스트로 추출하기위한 시작 위치를 찾으려면 이 필요하기 때문에 .readline()을 사용하여 파일을 한 줄씩 파싱하고, 은 추출을 일시 중지 한 다음 파일 끝까지 반복하십시오. 읽어 내 파일은 다음과 같이 포맷 :큰 파일을 읽는 데 파이썬 2.7에서 너무 많은 메모리가 필요합니다

f=open('myfile','r') 
blocknum=0 #number the data block 
data=[] 
while True: 
     # find the extract begnning 
     while not f.readline().startswith('/sign/'):pass 
     # creat multidimensional list to store data block 
     data=append([]) 
     blocknum +=1 
     line=f.readline() 

     while line.strip(): 
     # check if the line is a blank line, i.e the end of one block 
       data[blocknum-1].append(["2.6E" %float(x) for x in line.split()]) 
       line = f.readline() 
     print "Read Block %d" %blocknum 
     if not f.readline(): break 

실행중인 결과가 거의 2기가바이트 RAM을 소비 500 미터 파일을 읽은 :

 
blabla... 
useless.... 
... 
/sign/ 
data block(e.g. 10 cols x 1000 rows) 
... blank line 
/sign/  
data block(e.g. 10 cols x 1000 rows) 
... blank line 
... 
EOF 

이의이 파일 'myfile을' 내 파이썬 조각을 부르 자 , 나는 그것을 알아낼 수 없다, 누군가는 돕는다! 대단히 감사합니다!

+4

코드를 확인하십시오. 형식, 의미 및 구문상의 문제가 있습니다 ('append'는 어디에서 왔습니까?). 또한 표준 파이썬 들여 쓰기 (4 공백)를 사용하고 같은 줄에 둘 이상의 명령문을 쓰지 않도록하십시오. – GaretJax

+0

일반 데이터 블록 몇 줄을 보여줄 수도 있습니까? – NPE

답변

0

코드에 비 python 모호한 줄이 꽤 있습니다. 나는 확실하지 오전하지만 먼저 코드를 다음과 같은 방법을 수정 한 다음 메모리 사용에 대해 다시 확인할 수 있다고 생각 :

data=[] 

with open('myfile','r') as f: 
    for line in f: 
     # find the extract beginning - think you can add here more parameters to check 
     if not line.strip() or line.startswith('/sign/'): 
      continue 
     data.append(["%2.6E" % float(x) for x in line.strip().split()]) 

하지만이 코드는 메모리를 꽤 많이 사용하는 것이라고 생각 - 당신이 경우 파일에서 모든 읽기 데이터를 저장할 필요가 없습니다. 코드를 수정하여 생성기 표현을 사용하고 파일 데이터를 한 줄씩 진행하면됩니다. 이렇게하면 추측 할 수있는 추억을 저장할 수 있습니다.

관련 문제