我将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到255之间的整数(包括0和255)。这意味着,保存为ASCII最多将需要
,
的1个字符这会导致光盘上每个元素最多5个字节(平均少一些)。
Pandas 默认将其读取/解释为
int64
数组(请参阅full.dtype
),这意味着每个元素需要8个字节,这导致npy文件的大小更大(其中大多数为零!)。要保存0到255之间的整数,我们只需要一个字节,因此npy文件的大小可以减少8倍而不会丢失任何信息-只是告诉 Pandas 它需要将数据解释为无符号的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个字节:
ASCII格式的
,
就可以了,因为分隔符就足够了)。