Как масштабировать операции с массивным словарем списков в Python? - PullRequest
2 голосов
/ 23 марта 2020

Я имею дело с проблемой «больших данных» в python, и я действительно борюсь за масштабируемые решения.

Структура данных, которую я сейчас имею, представляет собой огромный словарь списков с миллионами ключей и списками с миллионами элементов. Мне нужно сделать операцию над элементами в списке. Проблема двоякая:

(1) Как выполнить масштабируемые операции над структурой данных такого размера?

(2) Как сделать это с ограничениями памяти?

Для некоторого кода, вот очень простой c пример словаря списков:

example_dict1 = {'key1':[367, 30, 847, 482, 887, 654, 347, 504, 413, 821],
    'key2':[754, 915, 622, 149, 279, 192, 312, 203, 742, 846], 
    'key3':[586, 521, 470, 476, 693, 426, 746, 733, 528, 565]}

Для простой операции над элементами нормальным подходом будет итерация по словарю:

new_dictionary = {}

for k, v in example_dict.items():
    new_list = []    
    for i in v:      ## iterate through dictionary lists
        i = compute_something(i) ## this is just an example, e.g. i**2 or i-13 would also work
        new_list.append(i)
    # now, create a new dictionary
    new_dictionary[k] = new_list

Проблема в том, что это не может работать для словаря такого размера - я работаю на сервере с более чем 250 ГБ ОЗУ, и он быстро становится слишком большим для памяти. Это также слишком медленно / не масштабируется, так как это одна итерация с одним процессором.

Существуют ли масштабируемые решения этой проблемы?

Может быть, это поможет как-то разбить словарь, сделать вычисления многопроцессорными и агрегировать? Или есть способ сохранить эти данные на диск?

Я в недоумении для идей ...

...