2012-03-30 5 views
2

HTTP를 통해 다중 회선 데이터를 받았으며 한 줄로 구성했습니다. 특정 키워드가 들어있는 줄만 필터링하여 파일에 기록해야합니다.파이썬에서 줄 단위로 문자열을 효율적으로 처리하는 방법은 무엇입니까?

과도한 메모리를 사용하지 않고 이러한 개별 라인을 어떻게 처리합니까? 나는. 줄 바꿈에서 입력 문자열을 분리하지 않고 목록을 처리하지 않고도?

자이 썬 특정 솔루션도 환영합니다. 이 있습니다, 그러나

for line in re.finditer('.*?\n', data): 
    # do stuff 

:

답변

0

이제 실제로 자이 썬에서 data.split ('\ n'), re.finditer ('. *? \ n', data) 및 StringIO.readline()을 사용하는 데 필요한 메모리 요구 사항을 테스트했습니다. Split()이 사용 된 메모리 (PS Old Gen)를 증가시키지 못했고, StringIO가 두 번째와 세 번째로 나온 것을 알면 놀랐습니다.

Jython 2.5.1+: 
    split() +0 x data 
    StringIO +2 x data 
    re  +4 x data 

Jython 2.2.1: 
    split() +0 x data 
    re  +2 x data 
    StringIO +7 x data 

StringIO가에 .write() 호출 후 추가 메모리를 사용하지 않은, 즉 자이 썬에서 동일한 문자열로 백업 할 것으로 보인다.

속도를 테스트하지 않았습니다.

0

당신은 str.split의 더 반복자 버전이 없기 때문에 컴파일 된 정규 표현식 python re

1

를 사용하려고 할 수 있습니다, 당신의 최선의 방법은 re 모듈을 사용하여 에뮬레이션하는 것입니다 일반 split 메소드와는 달리 후행 개행 문자를 그대로 두게됩니다.

0

StringIO 모듈을 사용하여 파일과 유사한 객체로 문자열에 액세스하십시오. 그런 다음 파일에 대해 수행하는 것처럼 행을 반복 할 수 있습니다.

+0

'StringIO'는 메모리 단위로'.split()'보다 반드시 좋을 수는 없으며, 변경 가능하기 때문에 반드시 같은 문자열에 의해 뒷받침되지는 않습니다 * 초기 값으로 전달합니다. – lvc

+0

@lvc : 그렇지 않습니다. 그것에 쓰지 않으면 같은 문자열을 유지합니다. 글을 쓰더라도 읽지 않으면 더 많은 메모리를 소비하지 않습니다. 확신하고 싶으면 소스 코드를 확인하십시오. 단지'StringIO' 객체를 만들고 읽기만하면 여분의 메모리가 필요하지 않습니다. – Avaris

+0

자이 썬의 소스 코드를 보았을 때,'StringIO' 모듈은 실제로 당신이 제안한대로 동작하지만, 새로운'io.StringIO' 클래스는 자이 썬의'cStringIO' (그리고 나는 CPython의'cStringIO'를 체크하지 않았다.) – lvc

관련 문제