我正在尝试使用 dask 读取 220 GB csv 文件。该文件的每一行都有一个名称、一个唯一的 id 和其父级的 id。每个条目都有多代父项,最终我希望能够重新组装整个树,但是当我尝试找到一个条目的父项时需要 15 分钟(相比之下,PySpark 中的 4 分钟具有大致相同的节点配置)。我在四个节点上运行,一个节点上有调度程序,其他三个节点上有 12 个工作程序。这是我正在使用的代码:
#!/usr/bin/env python
import dask.dataframe as dd
from dask.distributed import Client
client = Client("hostnode:8786")
def find_parent(df,id):
print "searching for",id
newdf = df[df["fid"] == id][["pid","name","fid"]].compute()
print newdf.head()
print "found it",newdf["name"].tolist()[0]
biggie = dd.read_csv("input_file.csv",delimiter=",",names=["fid","pkn","pid","name","updated"],escapechar="\\")
print biggie.head()
find_parent(biggie,"0x240006b93:0x10df5:0x0")
关于如何加快速度的提示将不胜感激。
最佳答案
首先,我会看看什么是占用最多时间的。您可能需要查看诊断仪表板中的配置文件选项卡。见 http://distributed.readthedocs.io/en/latest/diagnosing-performance.html#statistical-profiling
我怀疑您将所有时间都花在解析 csv 文件上。您可能想使用 usecols=
参数以减少需要解析的参数数量。为此,您应该查看 pandas.read_csv 文档。您还可以考虑使用更少的线程使用更多的进程。 Pandas.read_csv 在解析文本列时不会释放 GIL。
关于dask - 处理大数组时计算速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48456396/