44

約 50 GB のテキスト ファイルがあり、各行の最初の数文字をチェックして、その開始テキスト用に指定された他のファイルにそれらを書き込んでいます。

例えば。私の入力には以下が含まれます:

cow_ilovecow
dog_whreismydog
cat_thatcatshouldgotoreddit
dog_gotitfromshelter
...............

なので、牛、犬、猫(約200頭)のカテゴリーで処理したいので、

if writeflag==1:
    writefile1=open(writefile,"a") #writefile is somedir/dog.txt....
    writefile1.write(remline+"\n")
    #writefile1.close()

それで、最善の方法は何ですか、閉じる必要がありますか?そうでなければ、開いたままにしておくとwritefile1=open(writefile,"a")、正しいことをしていますか?

4

4 に答える 4

60

ファイルをできるだけ開いたり閉じたりしないようにしてください。

ファイルの読み取り/書き込みと比較しても、ファイルのオープン/クローズははるかにコストがかかるため

次の 2 つのコード ブロックを検討してください。

f=open('test1.txt', 'w')
for i in range(1000):
    f.write('\n')
f.close()

for i in range(1000):
    f=open('test2.txt', 'a')
    f.write('\n')
    f.close()

最初のものは0.025秒かかり、2番目のものは0.309秒かかります

于 2012-07-05T17:32:25.357 に答える
6

ステートメントを使用するwithと、ファイルが自動的に閉じられ、ブロック内のすべての操作が実行withされるため、ファイルを開いたままにし、ブロックから出たらファイルを閉じますwith

with open(inputfile)as f1, open('dog.txt','a') as f2,open('cat.txt') as f3:
   #do something here

編集: コードのコンパイル前に使用できるすべてのファイル名がわかっている場合withは、使用する方が良いオプションです。そうでない場合は、アプローチを使用する必要がありますが、ファイルを閉じる代わりにflushwritefile1.flush()

于 2012-07-05T17:00:23.757 に答える
2

ずっと開いておいてください!そうしないと、常に書き込みが完了していることをシステムに伝え、バッファリングする代わりにディスクにフラッシュすることを決定する可能性があります。そして明らかな理由から、n回のディスク書き込みは1 回のディスク書き込みよりもはるかにコストがかかります。

ファイルに追加して上書きしない場合は、yesaが正しいモードです。

于 2012-07-05T16:59:25.307 に答える
0

IO 操作に時間がかかりすぎます。また、ファイルを開いたり閉じたりします。

両方のファイル (入力と出力) を開き、たとえば 10MB のサイズのメモリ バッファーをテキスト処理に使用してから、これを出力ファイルに書き込むと、はるかに高速になります。例えば:

file = {} # just initializing dicts
filename = {}
with open(file) as f:
    file['dog'] = None
    buffer = ''
    ...
    #maybe there is a loop here
    if writeflag:
        if file['dog'] == None:
            file['dog'] = open(filename['dog'], 'a')
        buffer += remline + '\n'
    if len(buffer) > 1024*1000*10: # 10MB of text
       files['dog'].write(buffer)
       buffer = ''

for v in files.values():
    v.close()
于 2012-07-05T17:22:10.820 に答える