我将csv更改为npy文件。更改后,csv文件的大小为5GB,npy为13GB。 我认为一个npy文件比csv更有效。 我误会吗?为什么npy的大小比csv大?
我刚刚使用了这段代码
full = pd.read_csv('data/RGB.csv', header=None).values
np.save('data/RGB.npy', full, allow_pickle=False, fix_imports=False)
和这样的数据结构:
R, G, B, is_skin
2, 5, 1, 0
10, 52, 242, 1
52, 240, 42, 0
...(row is 420,711,257)
答案 0 :(得分:8)
在您的情况下,元素是0到255之间的整数(包括0和255)。也就是说,将其保存为ASCII最多
,
的1个字符这会导致光盘上每个元素最多5个字节(平均少一些)。
Pandas默认将其读取/解释为int64
数组(请参见full.dtype
),这意味着每个元素需要8个字节,这导致npy文件的大小更大(大多数都是零!)。
要保存0到255之间的整数,我们只需要一个字节,因此可以将npy文件的大小减小8倍而不会丢失任何信息-只是告诉熊猫它需要将数据解释为无符号的8位整数:
full = pd.read_csv(r'e:\data.csv', dtype=np.uint8).values
# or to get rid of pandas-dependency:
# full = np.genfromtxt(r'e:\data.csv', delimiter=',', dtype=np.uint8, skip_header=1)
np.save(r'e:/RGB.npy', full, allow_pickle=False, fix_imports=False)
# an 8 times smaller npy-file
大多数时候,npy格式需要较少的空间,但是在某些情况下,ASCII格式会导致文件较小。
例如,如果数据主要由非常小的数字组成,其中只有一位数字,而又有一些非常大的数字,那么对于它们,实际上需要8个字节:
,
本身就足够了,因为分隔符就足够了。)