2011-09-13 5 views
1

나는 내 이전 질문을 끊임없이 개선하고 있다고 생각합니다. 기본적으로 조각을 다중 프로세스로 보내려면 큰 텍스트 (csv) 파일을 청크 (chunk)해야합니다. 이렇게하려면 반복 가능한 선에서 반복 할 수있는 객체가 필요하다고 생각합니다. 반복 가능한 객체가 파이썬에서 길이가없는 이유는 무엇입니까?

지금 나는 당신이 TEXTFILE을 연 후 파일 객체 자체 (또는 _io.TextIOWrapper 유형) 라인으로 반복 가능한 라인 인 것을 깨달았다 (how to multiprocess large text files in python? 참조), 그래서 아마 내 이전을 누락, 지금 아래 (미안 코드를 청크) 그것의 길이를 얻을 수 있다면, 그것을 덩어리 수 있습니까? 그러나 iterable 인 경우 왜 단순히 길이를 호출 할 수 없습니까 (줄 단위가 아닌 바이트 단위)?

감사합니다.

def chunks(l,n): 
    """Divide a list of nodes `l` in `n` chunks""" 
    l_c = iter(l) 
    while 1: 
     x = tuple(itertools.islice(l_c,n)) 
     if not x: 
      return 
     yield x 

답변

3

파일을 반복 할 수있는 이유는 파일을 연속해서 읽는 것입니다. 파일의 길이는 행 이 처리되지 않으면 계산할 수 없습니다. (파일의 길이는 바이트 단위입니다.)

파일 크기가 기가 바이트 인 경우, 도움이 될 수 있다면 파일을 두 번 읽는 것을 원하지 않을 수 있습니다.

그래서 길이를 알지 않는 것이 좋습니다. 그렇기 때문에 길이가있는 콜렉션/벡터/배열보다는 데이터 파일을 Iterable으로 처리해야합니다.

청크 코드는 파일 객체 자체를 처리 할 수 ​​있어야하며 길이는 알지 못합니다. 완전히 처리하기 전에 라인의 번호를 알고 싶다면

그러나, 당신이 옵션은

  1. 다음, 첫번째 라인의 배열로 전체 파일을 버퍼링하여 chunker에이 라인을 통과 있습니다
  2. 두 번 이상 읽으십시오. 처음으로 모든 데이터를 버리고 그냥 줄을 기록하십시오.
+0

고마워요! 나는 8 개의 코어가 결국 라인을 계산하는 비용으로 실제 작업을 끝내면 더 많은 것을 얻길 바랍니다. 청크에 넣고 코어에 보내는 줄 수를 모르는 채로 청킹을 할 수있는 방법은 없습니다. 나는 이것이 내가 py3k에서 얻을 수있는만큼 좋기를 바랍니다 :

관련 문제