2009-05-06 9 views
2

미리 감사드립니다. 나는 작은 파일을 위해 작동하는 프로그램을 작성했다. 하지만 1GB의 파일에는 작동하지 않습니다. 대용량 파일을 처리 할 방법이 있는지 말해주세요. 여기에 코드가 있습니다.파이썬에서 파일 처리

fh=open('reg.fa','r') 
c=fh.readlines() 
fh.close() 
s='' 
for i in range(0,(len(c))): 
    s=s+c[i] 
    lines=s.split('\n') 
    for line in s: 
      s=s.replace('\n','') 
s=s.replace('\n','')   
print s 
+0

더 많은 설명을 추가해야합니다.reg.fa가 메모리가 크다면 너무 큽니다. 파이썬에서 어떤 유닛을 반복하는 것은 쉽지만 메모리에 의해 여전히 제약을 받게 될 것입니다. 나는 한 번에 한 행을 읽고 다시 쓰고 싶지 않을 것이라고 생각한다. 문자열을 추가하면 포인터가 엉망이 될 것이므로 새 파일에 작성해야한다고 생각합니다. – PyNEwbie

+0

범위 (0, len (c))를 지정하지 않아도됩니다. 다양한 반복자에 익숙해 질 때까지 범위 (len (c))에서 항상 i와 같은 작업을 수행 할 수 있습니다. – PyNEwbie

답변

5

readlines()를 사용하면 전체 파일을 한 번에 읽을 수 있으므로 1GB의 메모리를 사용합니다. 이 시도의 Insted :

f = open(...) 
while 1: 
    line = f.readline() 
    if not line: 
    break 
    line = line.rstrip() 
    ... do something with line 
    ... 
f.close() 

모두 당신이 필요 \를 제거하려면 n 다음 라인으로 라인을하지 않지만, 텍스트의 덩어리와 함께 할 경우 :

import sys 

f = open('query.txt','r') 
while 1: 
    part = f.read(1024) 
    if not part: 
     break 
    part = part.replace('\n', '') 
    sys.stdout.write(part) 
+0

1024는 덤 로우 버퍼 크기입니다 . 최소 64KiB로 늘려야합니다. 또한 python에서 readlines-method의 생성기를 사용하지 않는 것은 어리 석다. – Cheery

+0

파이썬에 발전기가 있기 전에 readlines 메소드가 추가되었으며 나중에 변경하면 기존 프로그램이 중단됩니다. 그것은 진화하는 언어의 저주입니다. –

17

readlines 방법 읽기 전체 파일에 있습니다. 실제 메모리 크기와 관련하여 큰 파일에 대해서는이 작업을 수행하지 않으려 고합니다.

해결 방법은 작은 청크로 파일을 읽고 개별적으로 처리하는 것입니다. 당신은, 예를 들어, 같은 것을 할 수 있습니다

for line in f.xreadlines(): 
    ... do something with the line 

xreadlines 라인의 목록,하지만 for 루프를 호출 할 때, 한 번에 하나 개의 행을 반환하는 반복자를 반환하지 않습니다. 더 간단한 방법은 다음과 같습니다.

파일 내용에 따라 파일을 쉽게 처리하거나 어렵게 처리 할 수 ​​있습니다. 나는 당신의 샘플 코드가 무엇을 하려는지 실제로 알지 못했지만 라인별로 할 수있는 것처럼 보였다.

7

스크립트가 파일의 모든 줄을 미리 읽어서 전체 파일을 메모리에 보관해야하기 때문에 스크립트가 작동하지 않습니다. 파일의 모든 행을 반복하는 가장 쉬운 방법은

for line in open("test.txt", "r"): 
    # do something with the "line" 
+0

이제 올바른 것으로 보입니다. 쪽으로! – Cheery

2

프로그램이 매우 중복되어 있습니다. 당신이하는 모든 일이 다음과 같은 행을 사용하여 수행 될 수있는 것처럼 보입니다.

import sys 
for line in open('reg.fa'): 
    sys.stdout.write(line.rstrip()) 

충분합니다. 이 프로그램 은 원래 코드에서 동일한 결과를 질문에 표시하지만 훨씬 간단하고 명확합니다. 또한 모든 크기의 파일을 처리 할 수 ​​있습니다.

+0

정확히 같은 결과를 제공하지 않습니다 :이 명령은 줄 끝 기호뿐만 아니라 줄의 모든 후행 공백을 제거하고 마지막 줄 바꿈을 인쇄하지 않습니다 – Miles

0

코딩 과정에서 단일 행의 문자열 버퍼를 사용하는 것이 확실합니다. 코딩의 관점에서 전체 파일 내용을 하나의 문자열 버퍼에 저장하는 것은 좋지 않습니다. 그런 다음 요구 사항을 처리했습니다. 코드에 너무 많은 로컬 변수가 있습니다.

다음과 같은 코드를 사용할 수 있습니다.

F = 개방 (FILE_NAME, 모드)

F 라인에 대한

:

""" 

Do the processing 

""" 
0
import sys 
import os 

사용 WB + 모드 파일이 생성되지 않은 경우,이 파일을 만들고 또한 데이터를 기록 할 것이다!

f = open('f_name.txt','wb+') 
while 1: 
    part = f.read(1024) 
    if not part: 
     break 
    part = part.replace('\n', '') 
    sys.stdout.write(part) 
f.close()