2011-08-02 16 views
0

リストアするデータの開始位置を調べるのに が必要なため、.readline()を使用してファイルを1行ずつ解析し、末尾に 展開を一時停止し、ファイルの終わりまで繰り返します。 読み込むための私のファイルは、次のようにフォーマットされます。大きなファイルの読み込みにPython 2.7のメモリが多すぎる

 
blabla... 
useless.... 
... 
/sign/ 
data block(e.g. 10 cols x 1000 rows) 
... blank line 
/sign/  
data block(e.g. 10 cols x 1000 rows) 
... blank line 
... 
EOF 

はのは、「myfileを」 このファイルを呼び出すと、私のpythonスニペットてみましょう:

f=open('myfile','r') 
blocknum=0 #number the data block 
data=[] 
while True: 
     # find the extract begnning 
     while not f.readline().startswith('/sign/'):pass 
     # creat multidimensional list to store data block 
     data=append([]) 
     blocknum +=1 
     line=f.readline() 

     while line.strip(): 
     # check if the line is a blank line, i.e the end of one block 
       data[blocknum-1].append(["2.6E" %float(x) for x in line.split()]) 
       line = f.readline() 
     print "Read Block %d" %blocknum 
     if not f.readline(): break 

実行した結果は、500Mのファイルを読まれたことはほぼ2ギガバイトのRAMを消費、私は それを把握することができない、誰かの助け! ありがとうございました!

+4

コードを確認してください。それは異なる書式設定、意味論的および構文的問題( 'append'はどこから来たのですか?)を持っています。また、標準のpythonインデント(4スペース)を使用し、同じ行に複数のステートメントを記述しないことも検討してください。 – GaretJax

+0

一般的なデータブロックを数行表示することもできますか? – NPE

答えて

0

あなたのコードには非平凡なあいまいな行がたくさんあります。私はわからないが、あなたが最初にあなたのコード、次の方法を変更し、メモリの使用量に対して、それを再度確認することができると思います。

data=[] 

with open('myfile','r') as f: 
    for line in f: 
     # find the extract beginning - think you can add here more parameters to check 
     if not line.strip() or line.startswith('/sign/'): 
      continue 
     data.append(["%2.6E" % float(x) for x in line.strip().split()]) 

しかし、私は、このコードは、メモリのかなり多くを使用することを考えて - しかし、あなたならばファイルからのすべての読み込みデータを格納する必要はありません。コードを変更してジェネレータ式を使用し、ファイルデータを1行ずつ進めることができます。これはあなたのメモリを節約します。

関連する問題