【发布时间】:2020-02-27 23:21:56
【问题描述】:
我正在尝试从数据库加载相对大量的数据,并且我想通过在开始加载之前分配适当的数据类型来优化我的数据框。但到目前为止,我发现我只能在加载数据框后优化数据类型,我可以从下面的代码中看到这种情况。因此,如果有任何其他方法可以尽早分配数据类型,这将真正帮助我管理代码的内存需求。
dbdf = pd.DataFrame(columns=['ID', 'Incr', 'Found'])
dbdf = dbdf.astype({'ID': str, 'Incr': np.int16, 'Found': str})
dbdf = pd.read_sql(
'SELECT substring_index(ID, \'.\', 2) as ID, Incr, \'Y\' as Found FROM database.',
conn, coerce_float=True) # database dataframe
print('$$$$$BEFORE$$$$$')
print(dbdf.memory_usage())
print(dbdf.dtypes)
print('$$$$$AFTER$$$$$')
dbdf = dbdf.astype({'ID': np.float64, 'Incr': np.int16, 'Found': str})
print(dbdf.memory_usage())
print(dbdf.dtypes)
以下是结果
$$$$$BEFORE$$$$$
ID 6695328
Incr 6695328
Found 6695328
dtype: int64
ID object
Incr int64
found object
$$$$$AFTER$$$$$
ID 6695328
Incr 1673832
Found 6695328
dtype: int64
ID float64
Incr int16
Found object
【问题讨论】:
-
我很好奇,将 ID 设为 float64 而不是字符串能节省多少?
-
我似乎找不到“字符串”类型来查看,即使我的代码指定了“str”,所以我可以告诉那里的保存,但即使是“Incr”,我也没有得到那些在加载期间保存,我只能在加载 df 后执行此操作。我正在加载一个表,只是上面的列,大约有 5.6 亿条记录,我的 8GB 内存容器快用完了。我很确定我可以设法将它加载到给定的内存中,但似乎无法分配正确的类型。
-
如果您能够在单个节点上将 5.6 亿条记录加载到 8 gig 的 ram 中,那么您就是我的英雄
-
哈哈哈 :) 谢谢你扼杀了我的希望。顺便说一句,我刚开始使用 Python 和数据框。关于如何将由 ID(样本值:'2287.99999')+ Incr(样本值:345362)和 Found(样本值:'Y')组成的 5.6 亿条记录放入数据框中的任何建议。
标签: python pandas dataframe memory types