Реализация генератора Python не снижает потребление памятиPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Реализация генератора Python не снижает потребление памяти

Сообщение Anonymous »

У меня есть три файла json.gz. Эти три файла содержат разные данные (рестораны, меню и сопоставления), сгруппированные по разным идентификаторам. Я должен прочитать их все и создать новые файлы JSON по идентификатору с соответствующими данными из этих трех файлов. У меня есть одна виртуальная машина, и у меня есть некоторые ограничения по памяти при запуске моего кода.
В начале я объединил эти три файла в три объекта json, а затем повторил их с помощью обычного for- петля. Благодаря этому решению мой код потребляет много памяти моей виртуальной машины, поскольку я загружаю все данные.
Я понял, что мне нужны только данные для определенного идентификатора для создания окончательного json. файл, и мне не следует загружать все данные для всех идентификаторов одновременно. Поэтому я подумал, что генератор Python будет решением в этом случае. Я создал следующий код:

Код: Выделить всё

from json import loads

def load_data_set(string_restaurants_data: str,
string_menus_data: str,
string_matchings_data: str,):

menus_data = loads(string_menus_data)
matchings_data = loads(string_matchings_data)
restaurants_data = loads(string_restaurants_data)

for id, menu_data in menus_data.items():
yield id, restaurants_data[id], menu_data, matchings_data[id] if id in matchings_data else "{}"

def main():
'''
some code to read the json.gz files. The data is stored in these three string variables: string_restaurants_data, string_menus_data and string_matchings_data
'''

restaurants_data_set = load_data_set(string_restaurants_data,
string_menus_data,
string_matchings_data)

size_generator = sys.getsizeof(restaurants_data_set)

del string_menus_data
del string_restaurants_data
del string_matchings_data
gc.collect()

list_result = {}
for restaurant in restaurants_data_set:
result_data = aggregate_menu_data(restaurant[0],
dumps(restaurant[2]),
dumps(restaurant[1]),
dumps(restaurant[3]),
string_parameters,
eval(debug))

list_result.update(result_data)

data['result'] = dumps(list_result)

Я проверил Диспетчер задач в ВМ и не увидел существенного снижения потребления памяти по сравнению с предыдущей версией без генераторов. Может ли кто-нибудь сообщить мне, правильно ли я реализовал генератор Python для решения моей потребности? или есть лучший способ загрузить только в память данные, необходимые для создания файла JSON, не влияя на скорость?
Версия Python: 3.11

Подробнее здесь: https://stackoverflow.com/questions/790 ... onsumption
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»