【问题标题】:Dask load and apply funtion on read_csv在 read_csv 上加载和应用函数
【发布时间】:2018-08-18 04:53:06
【问题描述】:

我正在尝试在我的计算机上加载具有 1.25 亿行.csv 大小为 4 GB 和 5 种类型的数据,这些数据具有以下功能:

  • CPU:Intel Core 2 Duo E7200 @ 2.53 GHz
  • 内存:8 GB DDR3 @ 1833 MHz
  • 高清:500 GB 7200 转
  • 操作系统:Ubuntu 16.04

当我运行这段代码时:

import dask.dataframe as dd
import numpy as np

dtypes = {'item_nbr':'int32', 'store_nbr':'int8', 'onpromotion':'bool' }
df_train = dd.read_csv('data/train.csv', dtype=dtypes, parse_dates=["date"], 
converters={'unit_sales': lambda u: np.log1p(float(u)) if float(u) > 0 else 0}, 
usecols=[1, 2, 3, 4, 5]).compute()

我的电脑死机了,我需要重新启动它,有什么办法可以解决这个问题吗?

谢谢!

版本:

目前我正在尝试运行:df_train.unit_sales.map_partitions(np.log1p).compute() 我的电脑仍然冻结,那么,我怎样才能在不冻结我的电脑的情况下计算所有 1.25 亿行的对数?以及,如何检查调用计算是否安全?

【问题讨论】:

  • 这并不奇怪。在您调用.compute() 的那一刻,您触发了将所有数据带入内存的计算。这可能会产生 MemoryError。通常,您应该考虑您想要的结果,看看您是否可以在过滤后对较小的数据集触发compute()
  • 也许您可以使用nrowsskiprows 逐块读取您的csv?
  • 是的,我可以使用 skiprows,但我想转换整个数据集,然后对其进行过滤。那么,使用 chunksize 是一个好的解决方案吗?并使用“for”函数迭代所有数据集?
  • 你将如何保存你的输出?在计算结束时保存 4GB 文件可能会占用大量内存。如果结果要输入另一个计算并且它是可分块的,那是一种方法。
  • 我需要先计算所有unit_sales的对数再进行转换,所以最终输出是机器学习预测估计器的结果。

标签: python dask


【解决方案1】:

如 cmets 中所述,当您在 dask 数据帧上调用 .compute() 时,您是在说“我现在完成了,请将其转换为 pandas 对象”

在您的情况下,您可能不想立即执行此操作,而是希望在执行其他查询、聚合等之后执行此操作。

不好

df = dd.read_csv('lots-of-data-*.csv')
df = df.compute()  # this is very large and may not fit in memory

df = dd.read_csv('lots-of-data-*.csv')
df = df[df.value > 0]
result = df.groupby('name').value.mean()
result = result.compute()  # this is probably much smaller

【讨论】:

  • 谢谢!但是,如果我想应用一个函数来计算一列的每个值的对数,我该怎么做?我正在尝试: df_train.apply(lambda x: np.log1p(x), axis=1 , meta={'unit_sales':'float32'}).compute()
  • 我建议在 Stack Overflow 上将其作为一个单独的问题提出
猜你喜欢
  • 2012-11-19
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多