python - 4线程和12线程CPU之间没有明显的提升

标签 python dask

我尝试比较同一 Dask 代码在我的 2 台计算机上的 2 次执行。

第一台计算机配备 Intel I5 6500 4 线程/16GB RAM,另一台计算机配备 Intel I7 8750H 12 线程和/16GB RAM 的 MBP。

这是函数:

%%timeit
my_df.map_partitions(
    lambda df: df.apply(
        lambda x: detect(str(x['Description'])), axis=1)).\
compute(scheduler='processes')

我预计执行时间约为。速度快了 3 倍,但我得到了 10 000 行的结果:

I5 6500
22.9I7 8750H21.6

相同的分区大小和相同的参数。

这怎么可能?

最佳答案

一些注释可以帮助您了解情况。我注意到您没有指定数据的加载方式或 Detect 是什么。

  • i7 8750H 有 6 个核心,而不是 12 个。我有 12 个“超线程”,这意味着一个核心可以在线程之间快速交换,但您无法获得一个核心 12 倍的处理能力。 i5 6500有4核。您应该了解 Dask 正在创建多少个工作线程。
  • 计算整个结果,这意味着将分区复制回主客户端线程并将它们连接起来。这没有任何相似之处。
  • 也许您正在加载客户端中的所有数据,并且必须在开始处理之前将其拆分并复制给工作人员。
  • 您应该尝试使用分布式调度程序,您可以在其中指定进程和线程的组合,并通过仪表板获得有关正在发生的情况的更好反馈。有时,这个调度程序也表现得更好,因为它对图表和运行任务的位置有更好的内部组织和优化。

使用分布式调度程序,您可以只对处理部分进行计时

client = distributed.Client(...)
p_df = my_df.persist()
distributed.wait(p_df)

# time this bit
out = p_df.map_partitions(
lambda df: df.apply(
    lambda x: detect(str(x['Description'])), axis=1)).persist()
distributed.wait(out)

关于python - 4线程和12线程CPU之间没有明显的提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66528389/

相关文章:

python - 使用 dask 将 parquet 文件拆分为较小的 block

python - Pod错误-Fastparquet的建筑轮子失败

python - TensorFlow FixLengthRecordReader 占位符数据类型错误

python - 调用全局变量时无法解析的引用?

python - 将巨大的 dask 数据帧写入 parquet 因内存不足而失败

pandas - 如何将多个 Pandas 数据帧连接到一个大于内存的 dask 数据帧?

python - 为什么这个 CountVectorizer 输出与我的字数统计不同?

python - Pandas DataFrame 转置多列

python - 无法理解 OpenCV Python 函数参数

python - 如何将 dask.dataframe 预缓存到所有 worker 和分区以减少通信需求