2017-01-11 11 views
2

enter image description here私は配列としてPythonにロードしたい非常に大きなtxtファイル(約1.5 GB)をいくつか持っています。問題はこのデータにカンマが小数点記号として使用されていることです。小さなファイルの場合、私はこの解決策を思いついた。Python:小数点の区切り文字としてコンマを使用してデータを読み込みます。

import numpy as np 
data= np.loadtxt(file, dtype=np.str, delimiter='\t', skiprows=1) 
     data = np.char.replace(data, ',', '.') 
     data = np.char.replace(data, '\'', '') 
     data = np.char.replace(data, 'b', '').astype(np.float64) 

しかし、大きなファイルの場合、Pythonはメモリエラーに遭遇する。このデータを読み込むための、他にもメモリ効率のよい方法はありますか?

+0

ロケール設定を参照してください:http://stackoverflow.com/a/19208247/3377691 – VBB

+0

ファイルからサンプルデータの抽出を提供できますか?それはすべて1行に入っていますか? –

+0

この質問/回答を確認してください:http://stackoverflow.com/questions/8956832/python-out-of-memory-on-large-csv-file-numpy/8964779#8964779 –

答えて

0

NPの問題点。 loadtxt(file、dtype = np.str、delimiter = '\ t'、skiprows = 1)は、float64の代わりにpythonオブジェクト(文字列)を使用しているため、メモリが非常に非効率です。あなたは、あなたのファイルを読み込み、小数=セット「を、」デフォルトの動作を変更するために

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_table.html#pandas.read_table

read_tableパンダを使用することができます。これにより、シームレスな読み込みと文字列の浮動小数点への変換が可能になります。 pandasデータフレームをロードした後、df.valuesを使用してnumpy配列を取得します。 それはまだあなたのメモリ使用チャンク

http://pandas.pydata.org/pandas-docs/stable/io.html#io-chunking

まだ運がnp.float32フォーマット、さらに半分のメモリフットプリントを試していない場合は

には大きすぎだ場合。

0

各行を繰り返し解析するようにしてください(すべてのファイルをメモリに読み込まないジェネレータを暗黙的に使用する)。 また、そのサイズのデータ​​の場合、私は配列と同様のメモリを使用するpython標準arrayライブラリを使用します。つまり、メモリ内の他の値の隣に1つの値(numpy配列もメモリ使用率は非常に効率的です)。

import array 

def convert(s): 
    # The function that converts the string to float 
    s = s.strip().replace(',', '.') 
    return float(s) 

data = array.array('d') #an array of type double (float of 64 bits) 

with open(filename, 'r') as f: 
    for l in f: 
     strnumbers = l.split('\t') 
     data.extend((convert(s) for s in strnumbers if s!='')) 
     #A generator expression here. 

私は(同様のメモリフットプリント)同様のコードを使用すると、2次元配列を持っている必要があり、特別にあれば、numpy.arrayによってarray.arrayを交換書き込むことができると確信しています。

関連する問題