如何快速将大型CSV文件读入Python?

时间:2019-01-29 18:10:45

标签: python scala apache-spark pyspark dask

我正在尝试将〜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中的CPU利用率稳定地达到了100%。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

最后,您可能根本不想“加载”数据,而是对其进行处理。是的,如果您愿意(dask.persist,您可以有趣地使用Dask保留到内存中,但是请不要使用太多的工作程序来加载数据,这样您就可以将其放入客户端进程内存中的Pandas数据框中。 / p>