Использование ray для ускорения проверки файлов json

У меня более миллиона файлов json, и я пытаюсь найти самый быстрый способ сначала проверить, загружаются ли они, а затем, существуют ли key_A, key_B или ни то, ни другое. Я думал, что смогу использовать луч, чтобы ускорить этот процесс, но открытие файла, похоже, не работает с лучом.

В качестве упрощения, вот моя попытка просто проверить, загрузится ли файл:

import ray
ray.init()

@ray.remote
class Counter(object):
    def __init__(self):
        self.good = 0
        self.bad = 0

    def increment(self, j):
        try:
            with open(j, 'r') as f:
                l = json.load(f)
            self.good += 1
        except: # all files end up here
            self.bad += 1 

    def read(self):
        return (self.good, self.bad)
    

counter = Counter.remote()
[counter.increment.remote(j) for j in json_paths]

futures = counter.read.remote()
print(ray.get(futures))

Но в итоге у меня получается (0, len(json_paths)).


Для справки, у меня есть немного более сложная фактическая конечная цель: проверить:

new, old, bad = 0,0,0

try:
    with open(json_path, 'r') as f:
        l = json.load(f)
    ann = l['frames']['FrameLabel']['annotations']
    first_object = ann[0][0]
except:
    bad += 1
    return

if 'object_category' in first_object:
    new += 1
elif 'category' in first_object:
    old += 1
else:
    bad += 1

person Austin    schedule 10.08.2020    source источник
comment
Я не знаком с Рэем, но я думаю, может быть, это не та перевозка необходимого?   -  person Julia    schedule 10.08.2020
comment
Вы проверили, подходит ли луч для доступа к файлам? Предполагается, что он также может работать в распределенных системах.   -  person ypnos    schedule 10.08.2020
comment
Вы пытаетесь сделать это на одной машине или на кластере узлов? Похоже, Рэй ищет файлы не там, где вам нужно.   -  person Alex    schedule 11.08.2020


Ответы (2)


Я бы рекомендовал вообще не использовать для этого Python, а, например, jq.

Команда вроде

jq -c "[input_filename, (.frames.FrameLabel.annotations[0][0]|[.object_category,.category])]" good.json bad.json old.json

выходы

["good.json",["good",null]]
["bad.json",[null,null]]
["old.json",[null,"good"]]

для каждой из ваших категорий данных, что будет значительно проще анализировать.

Вы можете использовать, например. инструмент поиска GNU или, если вам хочется, parallel, чтобы придумать командные строки для запуска.

person AKX    schedule 10.08.2020

Вместо этого вы можете использовать встроенный параллельный модуль Python для выполнения своей задачи, для которой ray может не подходить наилучшим образом. Пример:

from concurrent.futures import ThreadPoolExecutor
numThreads = 10

def checkFile(path):
    return True # parse and check here

with ThreadPoolExecutor(max_workers=numThreads) as pool:
    good = sum(pool.map(checkFile, json_paths))
bad = len(json_paths) - good
person ypnos    schedule 10.08.2020