Kri*_*sty 8 python numpy python-3.x pandas
我有csv大小5.2GB的数据集(这里采取frm ).它有大约7M行维度= 29.值是类型float64.我想将此数据集转换为二进制文件.为此,我执行以下简单的操作:
import numpy as np
import pandas as pd
df = pd.read_csv('data.csv', sep=',')
np.asarray(df.values).tofile('data_binary.dat')
Run Code Online (Sandbox Code Playgroud)
数据快照如下所示:
0.000000000000000000e+00,9.439358860254287720e-02,1.275558676570653915e-02,9.119330644607543945e-01,-9.083136916160583496e-02,-2.335745543241500854e-01,-1.054220795631408691e+00,-9.759366512298583984e-01,-1.067278265953063965e+00,-6.138502955436706543e-01,7.542607188224792480e-01,-9.256605505943298340e-01,-5.289512276649475098e-01,1.235263347625732422e+00,8.606486320495605469e-01,-2.320102453231811523e-01,-4.043335020542144775e-01,-1.559396624565124512e+00,-8.154401183128356934e-01,-1.376865267753601074e+00,6.759096682071685791e-02,1.372575879096984863e+00,-5.736824870109558105e-01,-1.368692040443420410e+00,-4.793794453144073486e-01,1.529256343841552734e+00,-5.757816433906555176e-01,-1.290232419967651367e+00,4.999999694824218750e+02
1.000000000000000000e+00,3.272003531455993652e-01,-2.395536154508590698e-01,-1.592038273811340332e+00,-2.324983835220336914e+00,-5.070934891700744629e-01,1.574625492095947266e+00,-1.050106048583984375e+00,9.686639308929443359e-01,1.312386870384216309e+00,7.542607188224792480e-01,-9.113077521324157715e-01,-1.718587398529052734e+00,3.751282095909118652e-01,8.606486320495605469e-01,-3.711451292037963867e-01,-5.625200271606445312e-01,-2.721544206142425537e-01,-8.154401183128356934e-01,-3.339428007602691650e-01,1.058411240577697754e+00,4.364815354347229004e-01,-5.736824870109558105e-01,-2.172690257430076599e-02,-5.791836977005004883e-01,-3.260441124439239502e-01,-2.024624943733215332e-01,-4.585579931735992432e-01,7.500000000000000000e+02
Run Code Online (Sandbox Code Playgroud)
新的二进制文件data_binary.dat减少到1.5GB.这是一个巨大的减少,让我想知道我用来转换csv为二进制格式的方式出了什么问题.预计会减少吗?至少这么多?谢谢
好的,所以我去下载了数据样本。每行都是这样的:
0.000000000000000000e+00,9.439358860254287720e-02,1.275558676570653915e-02 ...
Run Code Online (Sandbox Code Playgroud)
每个数字看起来总共有25个字符,如果加上逗号,实际上每个字符有26个左右。因此,每个字符一个字节,大约25个字节。使用64位浮点数的二进制表示形式需要... 64位,即每个数字8个字节。因此,您应该期望二进制文件的大小小于1/3,因此这似乎是正确的:
5.2 / 3 = 1.73 ...
更好的估计是每个数字大约26个字符(包括逗号和换行符),因此:
In [2]: (8/26)*5.2
Out[2]: 1.6
Run Code Online (Sandbox Code Playgroud)
似乎是合法的。
| 归档时间: |
|
| 查看次数: |
1433 次 |
| 最近记录: |