【发布时间】:2020-03-01 07:18:37
【问题描述】:
我上传了 13 万个 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 秒。
我用multiprocessing 做这个:
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 不是很有用吗?
【问题讨论】:
-
@RobertNishihara,有什么想法吗?
-
Ray 是分布式计算的库,对吧?
-
@AlexanderCécile,是的 :)
-
好吧,我目前正在做一些快速研究并试图写一个答案:)
-
您能分享一下用于测试的 JSON 文件吗?