1

テストとして、pandas.HDFStore を使用して小さな 25 mg の csv ファイルを読み取ろうとしています。

store = pd.HDFStore('file.h5',mode='w')
for chunk in read_csv('file.csv',chunksize=50000):
     store.append('df',chunk)
store.close()

これにより、コンピューターがスラッシングし、最終的に完了すると、file.h5 は 6.7 ギガバイトになります。何がファイル サイズを膨らませているのかわかりません。後でストアを見ると、そこにあるのは小さなデータフレームだけです。チャンクせずに csv を読み込んでストアに追加しても、問題はありません。

更新 1: Python 2.7.6、HDF5 バージョン 1.8.9、numpy 1.8.0、pytables 3.1.0、pandas 13.1、ubuntu 12.04 を使用して、Anaconda を実行しています。データは独自のものであるため、チャンク情報をオンラインで投稿することはできません。私はいくつかの混合型を持っています。すべてをオブジェクトとして読み込もうとすると、それでもクラッシュします。

更新 2: 混合型のすべての列を削除しましたが、まだ同じ問題が発生しています。違いがあれば、非常に大きなテキスト列がいくつかあります。

更新 3: 問題は、データフレームを hdfstore にロードしているようです。ファイルのサイズを大幅に縮小しましたが、非常に幅の広い列 (1259 文字) の 1 つを保持しました。csv ファイルのサイズが 878.6kb であるのに対し、hdfstore のサイズは 53 MB です。pytables は非常に幅の広い列を処理できませんか? それを超えると切り捨てる必要があるしきい値はありますか?

4

1 に答える 1

0

幅の広いオブジェクト列は間違いなく問題です。私の解決策は、オブジェクト列を読み込んでいる間にオブジェクト列を切り捨てることでした。20 文字の幅に切り詰めると、h5 ファイルは csv ファイルの約 2 倍しか大きくなりません。ただし、100 文字に切り詰めると、h5 ファイルは約 6 倍の大きさになります。

回答として以下のコードを含めますが、多くのテキストを切り捨てることなくこのサイズの格差を縮小する方法を誰かが知っている場合は、感謝します.

store = pd.HDFStore(filepath, 'w')
for chunk in pd.read_csv(f, chunksize=5000, sep='\t',
                         na_values="null", error_bad_lines=False):

    chunk = chunk.apply(truncateCol)
    store.append(table, chunk)

def truncateCol(ser, width=100):
    if ser.dtype == np.object:
        ser = ser.str[:width] if ser.str.len().max() > width else ser
    return ser
于 2014-04-01T18:38:20.537 に答える