2009-05-06 13 views
2

ありがとうございます。私は小さなファイルのために働くプログラムを書いています。しかし、それは1GBのファイルでは機能しません。大きなファイルを扱う方法があるか教えてください。ここにコードがあります。ファイルの処理はPython

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がメモリのために大きければ、私はまた大きすぎると思う。いくつかのユニットでPythonを反復するのは簡単ですが、まだメモリに制約されます。私は一度に一本の線を読んでそれを書き留めたいとは思わない。それはしばらく時間がかかるだろう。私はあなたがあなたの文字列を追加するときあなたはポインタをつまんでいるので、あなたは新しいファイルに書き込む必要があると思う。 – PyNEwbie

+0

範囲(0、len(c))を指定する必要もありません。さまざまなイテレータに慣れるまでは、範囲(len(c))でiのようなことをいつでも行うことができます: – PyNEwbie

答えて

5

readlines()では、ファイル全体を一度に読むので、1 GBのメモリを使用します。この試みの 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

Pythonにジェネレータが追加される前にreadlinesメソッドが追加されました。後で変更すると、既存のプログラムが中断してしまいます。それは進化する言語の呪いです。 –

17

readlines方法は読み込み内全体ファイル。あなたは、あなたの物理的なメモリサイズに関連して大きなファイルのためにそれをしたくありません。

修正点は、ファイルを小さな塊で読み込んで個別に処理することです。あなたは、例えば、このような何かを行うことができます。

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

xreadlinesは、行のリストが、forループは、それを呼び出したときに、一度に1行を返すイテレータを返しません。もっと簡単な方法は次のとおりです:

for line in f: 
    ... do something with the line 

ファイルの行単位の処理は、簡単で難しい場合があります。私はあなたのサンプルコードが何をしようとしているのか実際には分かっていませんでしたが、行ごとに行うことができるように見えます。

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

あなたのコーディングから、1行の文字列バッファが必要であることは明らかです。 コーディングの観点から、ファイルコンテンツ全体を1つの文字列バッファに格納するのは悪いことです。そしてあなたの要件を処理しました。 コードにローカル変数が多すぎます。

次のコードを使用できました。

F =開放Fの行のための(file_nameに、モード)

""" 

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()