2014-04-10 3 views
0

나는 1,000 파일의 전화 번호부가있다. 각 파일은 여러 행을 가지며, 각 행은 4 - 8 바이트의 ngram입니다. 나는 각 파일을 헤더 행으로 구별하기 위해 모든 파일을 구문 분석하려고하는데, 각 파일에 대해 파일 내에서 발생하는 해당 ngram 시퀀스의 빈도를 가진 행을 작성하려고합니다.Pythonic 방식으로 2 억 개의 엘리먼트 데이터 세트를 처리 할 수 ​​있습니까?

다음 코드는 헤더를 수집했지만 헤더를 CSV 파일에 쓰려고 할 때 메모리 오류가 발생했습니다. 30GB의 RAM이있는 Amazon EC2 인스턴스에서 실행했습니다. 누구나 내가 모르는 최적화에 대한 권장 사항을 제공 할 수 있습니까?

#Note: A combination of a list and a set is used to maintain order of metadata 
#but still get performance since non-meta headers do not need to maintain order 
header_list = [] 
header_set = set() 
header_list.extend(META_LIST) 
for ngram_dir in NGRAM_DIRS: 
    ngram_files = os.listdir(ngram_dir) 
    for ngram_file in ngram_files:  
     with open(ngram_dir+ngram_file, 'r') as file: 
     for line in file: 
      if not '.' in line and line.rstrip('\n') not in IGNORE_LIST: 
      header_set.add(line.rstrip('\n')) 

header_list.extend(header_set)#MEMORY ERROR OCCURRED HERE 

outfile = open(MODEL_DIR+MODEL_FILE_NAME, 'w') 
csvwriter = csv.writer(outfile) 
csvwriter.writerow(header_list) 

#Convert ngram representations to vector model of frequencies 
for ngram_dir in NGRAM_DIRS: 
    ngram_files = os.listdir(ngram_dir) 
    for ngram_file in ngram_files:  
     with open(ngram_dir+ngram_file, 'r') as file: 
     write_list = [] 
     linecount = 0 
     header_dict = collections.OrderedDict.fromkeys(header_set, 0) 
     while linecount < META_FIELDS: #META_FIELDS = 3 
      line = file.readline() 
      write_list.append(line.rstrip('\n')) 
      linecount += 1 
     file_counter = collections.Counter(line.rstrip('\n') for line in file) 
     header_dict.update(file_counter) 
     for value in header_dict.itervalues(): 
      write_list.append(value) 
     csvwriter.writerow(write_list) 

outfile.close() 

답변

0

그냥 그 목록을 확장하지 마십시오. itertools의 체인을 사용하여 목록을 연결하고 대신 설정하십시오. 대신이의

:

headers = itertools.chain(header_list, header_set) 
... 
csvwriter.writerow(headers) 

적어도 현재보고있는 메모리 문제를 방지해야합니다

header_list.extend(header_set)#MEMORY ERROR OCCURRED HERE 

이 수행 (가정 csvwriter.writerow는 반복자를 받아 들인다).

관련 문제