python - 使用 Pandas 时如何解决内存错误?
问题描述
我知道 Memors Error 是使用 Pandas 库的不同功能时的常见错误。我想在几个方面获得帮助。在描述了问题之后,我的问题如下制定。
我的操作系统是 Ubuntu 18,工作空间是 Anaconda 框架内的 jupyter notebook,RAM 容量 8Gb。
我解决的任务。
我有超过 100,000 个字典,其中包含用户访问站点的数据,就像这样。
{'meduza.io': 2, 'google.com': 4, 'oracle.com': 2, 'mail.google.com': 1, 'yandex.ru': 1, 'user_id': 3}
有必要从这些数据中形成一个 DataFrame。起初,我使用 append 函数在 DataFrame 中逐行添加字典。
for i in tqdm_notebook(data):
real_data = real_data.append([i], ignore_index=True)
但是玩具数据集显示,这个功能需要很长时间才能完成。然后我直接尝试通过传递一个带有这样的字典的数组来创建一个 DataFrame。
real_data = pd.DataFrame(data=data, dtype='int')
转换少量数据已经足够快了。但是当我将完整的数据集传递给函数 Memory Eror 时出现。我跟踪 RAM 的消耗。该函数不会开始执行,也不会浪费内存。我试图扩展交换文件。但这不起作用,该功能无法访问它。
我知道要解决我的特定问题,我可以将数据分成几部分,然后将它们组合起来。但我不确定我是否知道解决这个问题的最有效方法。
我想了解如何计算 Pandas 操作所需的内存量。从这个题目的题数来看,在读取、合并等时会出现内存错误,是否可以包含一个交换文件来解决这个问题?
如何更有效地解决在DataFrame中添加字典的问题?“追加”工作效率不高。从完整的数据集中创建 DataFrame 效率更高,但会导致错误。我不了解这些过程的实现,但我想弄清楚像我的任务一样转换数据的最有效方法是什么。
解决方案
我建议指定列的 dtypes,它可能试图将它们读取为对象类型 - 例如,如果使用DataFrame.from_dict
then 指定 dtype 参数;dtype={'a': np.float64, 'b': np.int32, 'c': 'Int64'}
. 创建数据框的最佳方法是使用字典对象 - 永远不要使用 dataframe.append,因为它确实效率低下。
查看是否有任何其他程序也在您的系统上占用内存,并在尝试加载之前将其杀死。
您也可以尝试查看内存错误发生在什么时候 - 50k、70k、100k?
调试数据框并查看正在加载的类型,并确保这些类型是最小的合适的(例如,布尔而不是对象)。
编辑:如果您有很多稀疏条目,特别是如果有很多不同的域作为标头,可能会使您的数据框变得非常大。将列更改为更“键:值”的方法可能会更好,例如 {'domain': 'google.ru', 'user_id': 3, 'count': 10}。您可能有 100k 列!
推荐阅读
- docker - Azure DevOps 服务器 (onprem) - 容器作业 - 结帐不起作用
- mongodb - 如何在 MongoDB 中编写查询以滚动获取过去 7 天的数据
- python - 为什么在 Ubuntu 18.04 上运行 Selenium chrome 驱动程序时 chrome 浏览器不启动
- uri - 区分电子邮件地址和 IRI
- flutter - 有没有办法在 Flutter/Dart 中添加导航路线列表?
- c# - 在场景完全加载之前调用 Unity start()
- flutter - 有没有办法在 Flutter/Dart 中添加导航路线列表?
- javascript - 如何在 Nuxt Vue 实例中获取 Discord.js 客户端
- python-2.7 - 如何使用python将字典键值写入文本文件
- r - Firth 的惩罚逻辑回归 - 高卡方值