gpt4 book ai didi

python - Ray 比 Python 和 .multiprocessing 慢得多

转载 作者:太空宇宙 更新时间:2023-11-03 20:11:18 25 4
gpt4 key购买 nike

我上传了 130k json 文件。

我使用Python执行此操作:

import os
import json
import pandas as pd

path = "/my_path/"

filename_ending = '.json'


json_list = []

json_files = [file for file in os.listdir(f"{path}") if file.endswith(filename_ending)]

import time
start = time.time()

for jf in json_files:
with open(f"{path}/{jf}", 'r') as f:

json_data = json.load(f)

json_list.append(json_data)

end = time.time()

需要 60 秒。

我使用多处理来做到这一点:

import os
import json
import pandas as pd
from multiprocessing import Pool
import time

path = "/my_path/"

filename_ending = '.json'

json_files = [file for file in os.listdir(f"{path}") if file.endswith(filename_ending)]


def read_data(name):
with open(f"/my_path/{name}", 'r') as f:
json_data = json.load(f)

return json_data


if __name__ == '__main__':

start = time.time()

pool = Pool(processes=os.cpu_count())
x = pool.map(read_data, json_files)

end = time.time()

需要 53 秒。

我用ray来做到这一点:

import os
import json
import pandas as pd
from multiprocessing import Pool
import time
import ray


path = "/my_path/"

filename_ending = '.json'

json_files = [file for file in os.listdir(f"{path}") if file.endswith(filename_ending)]

start = time.time()

ray.shutdown()
ray.init(num_cpus=os.cpu_count()-1)

@ray.remote
def read_data(name):
with open(f"/my_path/{name}", 'r') as f:
json_data = json.load(f)

return json_data

all_data = []
for jf in json_files:
all_data.append(read_data.remote(jf))


final = ray.get(all_data)

end = time.time()

需要 146 秒。

我的问题是为什么 ray 需要这么多时间?

是不是因为:

1) 对于相对少量的数据,ray 相对较慢?

2)我的代码做错了什么?

3) ray 不是很有用吗?

最佳答案

我从未使用过ray,但我很有信心,我的解释应该是正确的。

原始代码进行了简单的 json 反序列化。该代码主要需要文件 IO 和少量 CPU。 (json反序列化相当快,这就是json成为流行交换格式的原因之一)

Ray 必须将数据从一个进程推送到另一个进程(如果通过网络分布在多台机器上)。为了做到这一点,它自己执行一些序列化/反序列化(也许它使用 pickle 和强大的 TCP 协议(protocol)来推送参数并收集结果)。而且这个开销可能比实际任务所需的工作量还要大。

如果您对 json 数据进行更多计算(任何 CPU 密集型数据),那么您将能够看到差异。

我的猜测是,您的示例问题太简单,因此 ray 的开销超出了使用多个工作线程的好处。

换句话说。分配任务和收集结果所花费的时间/精力比执行计算结果实际花费的时间/精力要多。

关于python - Ray 比 Python 和 .multiprocessing 慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58702492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com