9

Kaggle から KDD track1 データセットを取得し、16 GB のハイメモリ EC2 インスタンスで、最大 2.5 GB の 3 列の CSV ファイルをメモリにロードすることにしました。

data = np.loadtxt('rec_log_train.txt')

Python セッションがすべてのメモリ (100%) を使い果たし、その後強制終了されました。

次に、R を使用して (read.table 経由で) 同じファイルを読み取り、5 GB 未満の RAM を使用しましたが、ガベージ コレクターを呼び出した後、2 GB 未満に縮小しました。

私の質問は、これが numpy で失敗した理由と、ファイルをメモリに読み込む適切な方法です。はい、ジェネレーターを使用して問題を回避できますが、それが目標ではありません。

4

3 に答える 3

6
import pandas, re, numpy as np

def load_file(filename, num_cols, delimiter='\t'):
    data = None
    try:
        data = np.load(filename + '.npy')
    except:
        splitter = re.compile(delimiter)

        def items(infile):
            for line in infile:
                for item in splitter.split(line):
                    yield item

        with open(filename, 'r') as infile:
            data = np.fromiter(items(infile), float64, -1)
            data = data.reshape((-1, num_cols))
            np.save(filename, data)

    return pandas.DataFrame(data)

これにより、2.5GB ファイルが読み込まれ、出力行列がシリアル化されます。入力ファイルは「遅延」で読み取られるため、中間データ構造は構築されず、最小限のメモリしか使用されません。最初のロードには時間がかかりますが、後続の (シリアル化されたファイルの) ロードは高速です。コツがあれば教えてください!

于 2012-04-22T16:38:34.677 に答える
2

http://code.google.com/p/recfile/で今すぐ recfile を試してください。NumPy 用の高速な C/C++ ファイル リーダーを作成するために、私が知っている取り組みがいくつかあります。このような問題を引き起こすため、パンダの短いtodoリストに載っています。Warren Weckesser もここにプロジェクトを持っています: https://github.com/WarrenWeckesser/textreader。どっちがいいのかわからないので、両方試してみては?

于 2012-04-22T21:53:55.380 に答える
1

あなたが試すことができますnumpy.fromfile

http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html

于 2012-04-22T03:06:47.873 に答える