【问题标题】:How can I read a large CSV file into Python with speed?如何快速将大型 CSV 文件读入 Python?
【发布时间】:2019-01-30 04:46:23
【问题描述】:

我正在尝试将 ~67 gb 数据帧(6,000,000 个特征乘 2300 行)加载到 dask 中以进行机器学习。我在 AWS 上使用 96 核机器,我希望将其用于实际的机器学习位。但是,Dask 在单个线程中加载 CSV。它已经用了整整 24 小时,还没有加载。

#I tried to display a progress bar, but it is not implemented on dask's load_csv
from dask.diagnostics import ProgressBar
pbar = ProgressBar()
pbar.register()

df = dd.read_csv('../Larger_than_the_average_CSV.csv')

是否有更快的方法将其加载到 Dask 并使其持久化?我应该切换到不同的技术(Scala 上的 Spark 还是 PySpark?)

Dask 可能仍在加载它,因为我可以在 top 中看到稳定的 100% CPU 利用率。

【问题讨论】:

  • 您是从 S3 路径读取数据吗?如果是,那么 spark 将提供更好的性能。
  • @RamdevSharma 它只是存储在实例存储中的 CSV。您认为将其移至 s3 会提高性能吗?
  • 没有。 EC2 的 EBS 卷上的本地将比 S3 快得多。
  • 在您的情况下,您使用的是单个 m/c,因此 S3 将无济于事,但 spark 肯定会通过在本地模式下运行并具有更多执行程序来提供帮助。
  • @RamdevSharma 你会怎么做呢?我以前从未使用过火花。

标签: python scala apache-spark pyspark dask


【解决方案1】:

您在问题中显示的代码可能根本不需要任何时间,因为您实际上并没有加载任何内容,只是设置了工作处方。这需要多长时间取决于您指定的块大小。

实际加载需要考虑两个主要瓶颈:

  • 将数据从磁盘获取到内存,通过单个磁盘接口传输原始数据,
  • 将数据解析为内存中的内容

如果您在本地磁盘上,则对前者无能为力,而且您希望它只是一小部分。

后者可能会受到 GIL 的影响,即使默认情况下 dask 将在多个线程中执行(这就是为什么它可能看起来只使用一个线程的原因)。您最好阅读有关不同调度程序的 dask 文档,并且应该尝试使用分布式调度程序,即使您在一台机器上,混合了线程和进程。

最后,您可能根本不想“加载”数据,而是对其进行处理。是的,如果您愿意,您可以使用 Dask 将数据持久化到内存中(dask.persist,有趣的是),但请不要使用很多工作人员来加载数据,这样您就可以将其放入客户端进程内存中的 Pandas 数据帧中。

【讨论】:

  • 很确定 dd.read_csv 确实将整个 csv 读入了一个 dask 数据帧。据我了解,这不是映射任务,而是将 csv 转换为一组分区的 pandas dfs。读取后,我想做一些预处理,然后对数据运行随机森林。
  • 不,dd.read_csv 只读取元数据并为您提供指向数据的惰性指针。在这方面它与 spark 的版本相同。
  • hmmm....如果它根本不读取数据,为什么要花这么长时间?我还有其他代码可以告诉我这是否完成。
  • 确实需要在整个文件中找到行尾分隔符。尝试将您的块大小(很多)设置得更大。
  • 现在是默认值 (64 Mb)。您将如何确定理想的块大小?
猜你喜欢
  • 2016-04-29
  • 2021-04-17
  • 2018-11-01
  • 1970-01-01
  • 2018-12-09
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多