使用Pandas写入时,为什么CSV文件小于HDF5文件?

时间:2015-03-09 04:11:42

标签: python csv pandas hdf5 hdf

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

将数字表示为浮点数所占用的字节数应少于将其表示为每个数字一个字符的字符串。这通常是正确的,除了我的第一个例子,其中所有数字都是'0.0'。因此,表示数字所需的字符不多,因此字符串表示小于浮动表示。

2 个答案:

答案 0 :(得分:5)

简言之:

  • csv文件是'哑':它一次只有一个字符,所以如果你打印(比方说,四字节)浮点数1.0到十位数你真的使用那么多字节 - 但好消息是因为csv压缩得很好,所以请考虑.csv.gz

  • hdf5是一个元格式 No Free Lunch 定理仍然存在:条目和值需要存储在某处。这可能会使hdf5更大。

但是你忽略了一个更大的问题:csv只是文本。其精度有限 - 而hdf5是几种二进制(序列化)格式之一,可以将数据存储到更高的精度。在这方面,它确实是苹果和橘子。

答案 1 :(得分:2)

对于.csv,您的方法会存储如下字符:

999999,0.0<CR>

每个值最多11个字符。在100万的价值,这接近11MB。

HD5似乎将每个值存储为16字节浮点数,更别提它反复使用相同的值了。所以这是16字节* 1,000,000,大约是16 MB。

不是存储0.0,而是存储一些随机数据,而.csv会快速消失到25MB甚至更多,而HDF5文件保持相同的大小。虽然csv文件失去了准确性,但HDF5保留了它。