5
import numpy as np
import pandas as pd

df = pd.DataFrame(data=np.zeros((1000000,1)))
df.to_csv('test.csv')
df.to_hdf('test.h5', 'df')

ls -sh test*
11M test.csv  16M test.h5

さらに大きなデータセットを使用すると、効果はさらに大きくなります。以下のようなものを使用してHDFStoreも何も変わりません。

store = pd.HDFStore('test.h5', table=True)
store['df'] = np.zeros((1000000,1))
store.close()

編集:気にしないでください。例えが悪い!ゼロの代わりに重要な数字を使用すると、話が変わります。

from numpy.random import rand
import pandas as pd

df = pd.DataFrame(data=rand(10000000,1))
df.to_csv('test.csv')
df.to_hdf('test.h5', 'df')

ls -sh test*
260M test.csv  153M test.h5

数値を float として表現すると、1 桁あたり 1 文字の文字列として数値を表現するよりもバイト数が少なくて済みます。これは、すべての数値が '0.0' であった最初の例を除いて、一般的に当てはまります。したがって、数値を表すのに多くの文字は必要なく、文字列表現は float 表現よりも小さくなりました。

4

2 に答える 2

2

の場合.csv、メソッドは次のような文字を格納します。

999999,0.0<CR>

値ごとに最大 11 文字です。100 万の値では、これは 11MB 近くになります。

HD5 は各値を 16 バイトの浮動小数点数として格納しているようですが、何度も同じ値であることは気にしないでください。これは 16 バイト * 1,000,000 で、およそ 16 MB です。

0.0 ではなく、いくつかのランダム データを保存すると、.csv はすぐに 25MB 以上に膨れ上がりますが、HDF5 ファイルは同じサイズのままです。また、csv ファイルは正確性を失いますが、HDF5 はそれを保持します。

于 2015-03-09T04:34:22.977 に答える