我正在构建一个应用程序,以便从SQL数据库读入Pandas进行分析。数据是“中等数据” - 对于一台计算机(8GB RAM)来说,它太大而无法保存在内存中。我真的不想要花费成本和麻烦不断地开启AWS实例并且变得更加强大的硬件(我在非盈利方面工作),所以我希望优化我自己的数据读取内存成本。
我花了很长时间从mobify:http://www.mobify.com/blog/sqlalchemy-memory-magic/
实施此解决方案具体方法3:他们使用存储所有唯一字符串值的字典。这样可以避免重复包含相同字符串值的对象,而是将引用传递给同一个字符串。我拿了他们的代码并实现了它,结果非常令人印象深刻(内存使用减少了2-10倍,具体取决于数据切片)。
这很简单,我很困惑为什么熊猫本身没有这个。我是Pandas世界的菜鸟,但似乎大型数据集中的字符串重复是这一天给定的。 DataFrames中的默认字符串折叠有任何缺点吗?我在这里错过了什么吗?
TL; DR 大熊猫的弱点是高内存成本。字符串折叠似乎是一种显着减少内存开销的简单方法。为什么不拥有它?
答案 0 :(得分:3)
Pandas确实以类别的形式内置了类似的东西。它们可能只适用于相对较少数量的唯一字符串,但它们通过将每个唯一字符串映射到数字代码然后存储这些代码来节省内存使用量,例如:
import pandas as pd
import random
df = pd.DataFrame({'strs': [random.choice(['banana', 'pineapple', 'orange']) for i in range(100000)]})
df['catted'] = pd.Categorical(df['strs'])
df.memory_usage()
Out[10]:
strs 800000
catted 100024
dtype: int64