Как преобразовать список списков целых в список байтов без нехватки памяти в python3? - PullRequest
0 голосов
/ 04 марта 2020

Фон немного сложнее. Таким образом, у нас есть (в целях тестирования, может быть больше в производстве) файл .zip размером 1,2 ГБ, который мы разделяем на куски и отправляем через несколько экземпляров Onionshare. Как только получатель получает все чанки, он помещает их в список, называемый контентом. Поскольку каждый блок представляет собой список целых (не уверен, почему onionshare передает как целые числа, а не байты), контент представляет собой список списков целых. Однако, чтобы сохранить его должным образом, нам нужно (насколько я знаю) преобразовать его в список байтов и сохранить, используя b''.join Вот код, который у нас есть:

#Write total content to image.zip
#content is a list of lists of int, but saved value must be a simple list of bytes
#This is what I came up with to convert it to a list of bytes
content2 = []
for i in range (0, threads):
    for j in range(0, len(content[i])):
        content2.append(bytes(content[i][j]))
#And now it can be saved with a join
open("image.zip", "wb").write(b''.join(content2))    

Я довольно конечно, это должно работать, однако, делая это, мы сталкиваемся с проблемой, когда процесс останавливается из-за использования слишком большого количества памяти. Мы попытались записать файл пошагово, а не все сразу, но возникла та же проблема. Поэтому я думаю, что проблема с памятью происходит во время фактического преобразования. Кто-нибудь может предложить лучший способ сделать это?

Спасибо

1 Ответ

2 голосов
/ 04 марта 2020

Вам не нужно конвертировать всю коллекцию данных одновременно. Просто сконвертируйте и запишите каждый фрагмент данных по отдельности:

with open("image.zip", "wb") as f:
  for i in range(threads):
    for chunk in content[i]:
      f.write(bytes(chunk))

Единственные накладные расходы памяти здесь - это копия каждого отдельного фрагмента.

...