2011-12-09 18 views
6

大きなデータを処理しているので、データを読み取るための良い方法を見つけることが非常に重要です。 私は少し違う読み方について混乱しています。Pythonで大きなデータを読み取るさまざまな方法

1.f=gzip.open(file,'r') 
     for line in f: 
      process line 
    #how can I process nth line? can I? 
2.f=gzip.open(file,'r').readlines() 
    #f is a list 
    f[10000] 
    #we can process nth line 

3.f=gzip.open(file,'r') 
    while True: 
     linelist=list(islice(f,4)) 

4.for line in fileinput.input(): 
    process line 

2と3の違いは何ですか?私はちょうど彼らのメモリ使用量が同じであることがわかります。 islice()はファイル全体を最初にメモリにロードする必要があります。 そして、私は4番目の方法がメモリ消費量が最も少ないと聞いています。ビットごとに処理していますよね? 10GB規模のファイルの場合、どのファイルの読み込み方法をお勧めしますか?どんな思考/情報も歓迎されます。 thx

編集:私の問題の1つは、ランダムに特定の行をランダムに選ぶ必要があると思います。 say:

f1=open(inputfile1, 'r') 
while True: 
    line_group1 = list(islice(f1, 3)) 
    if not line_group1: 
     break 
    #then process specific lines say, the second line. 
    processed 2nd line 
    if (....): 
      LIST1.append(line_group1[0]) 
      LIST1.append(processed 2nd line) 
      LIST1.append(line_group1[2]) 

sth。 like

with open(file,'r') as f, 
    for line in f: 
     # process line 

が正しく動作しない可能性がありますか?

+0

大きなテキストファイルにランダムにアクセスする必要がありますか? –

+0

実際、必ずしもそうではありません。基本的には、行単位で処理してください。またはN行をグループとして表示します。 – user815408

答えて

4

をあなたが忘れてしまった -

with open(...) as f: 
    for line in f: 
     <do something with line> 

withステートメント・ハンドル内部ブロックで例外が発生した場合を含め、ファイルのオープンとクローズ。 for line in fは、ファイルオブジェクトfを反復可能ファイルとして扱います。このオブジェクトはバッファされたIOとメモリ管理を自動的に使用しますので、大きなファイルについて心配する必要はありません。

大型ファイルの場合は、両方とも2,332は、処理開始前にメモリ内のファイル内容全体をロードするため、大文字と小文字は区別されません。大きなファイルを読み込むには、ファイル全体を一度に読み取らない方法を見つける必要があります。

これを実行するには、1つ、好ましくは1つの明白な方法が必要です。

+0

ZEN引用の編集後にもう一度+1できませんでした。 ;) – mac

+0

thx、でも私の編集を見ることはできますか?時々私は特定の行(たとえば、10000行)を拾う必要があります。それではどうしたらいいですか? – user815408

+0

シンプルなので、基本的に行numである 'counter'を保持してください。その10000行目をチェックし、特別な取り扱いをしてください。 –

5

(プレゼンテーション用のPDFを参照してください)発電機で大きなログファイルを解析する上でのDavid M.ビーズリーの会談をチェックアウト:

http://www.dabeaz.com/generators/

1

あなたが何かを反復処理するようインデックスを取得するためにenumerateを使用することができます。

for idx, line in enumerate(f): 
    # process line 

シンプルかつ効率的なメモリ。どちらのアプローチは、ファイル全体をメモリに読み込み、また中間のリストを作成します

for line in islice(f,start,stop): 
    # process line 

:あなたが実際にすぎ isliceを使用し、最初のリストに変換せずに、それを反復処理することができます。

fileinputは、標準入力またはファイルのリストをすばやくループするためのヘルパークラスであり、メモリ効率の利点はありません。

Srikarは、ファイルを開く/閉じるにはwithステートメントを使用することを推奨します。

+0

islice(f、4)を使って、リストを作成しなければ、第一、第二、第三、第四の線を出す? (私が記事のように) – user815408

+0

通常は 'itlice(f、4)の行:print line'は1,2,3,4行目を出力します。 2行目から5行目が必要な場合は、代わりに 'islice(2,6)'などを使用することができます。 – zeekay

0

あなたが読んで何個の行を数えたか分かりません。 1では、行番号を取得する列挙型を追加できます。

0

大きなファイルの特定の行を読み取る場合は、linecache libraryを使用できます。

関連する問題