Как разбить большой общий объект Python на куски - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть большой общий объект Python, о котором у меня нет информации.Мне нужно разделить этот объект на более мелкие куски для хранения.

Надеюсь, кто-нибудь может помочь, Омер.

1 Ответ

0 голосов
/ 04 декабря 2018

pickle и разделить получающиеся данные.

Вы не можете сериализовать только "часть" объекта, потому что в общем случае нет такой вещи как "aчасть объекта ", вам нужны знания о его внутренностях, чтобы иметь возможность разделить его на части - которых, как вы заявили, у вас нет.

Однако вы можете использовать pickle.dump (который записывает в файлоподобный объект) и передает ему пользовательский файлоподобный объект, который вместо этого разбивает результирующие данные при получении.

Например, вот файловый объект, который записывает данные вфайлы в 2-гигабайтных чанках (в данном примере я вместо этого установил размер чанка в 4 мегабайта):

class SplitFile(object):
    def __init__(self, name_pattern, chunk_size=2*1024**3):
        self.name_pattern = name_pattern
        self.chunk_size = chunk_size
        self.file = None
        self.part = -1
        self.offset = None

    def write(self, bytes):
        if not self.file:  self._split()
        while True:
            l = len(bytes)
            wl = min(l, self.chunk_size - self.offset)
            self.file.write(bytes[:wl])
            self.offset += wl
            if wl == l: break
            self._split()
            bytes = bytes[wl:]

    def _split(self):
        if self.file:  self.file.close()
        self.part += 1
        self.file = open(self.name_pattern % self.part, "wb")
        self.offset = 0

    def close(self):
        if self.file:  self.file.close()

    def __del__(self):
        self.close()

import random
big_object = [random.random() for _ in range(1000000)]
import pickle
dest = SplitFile("data.part%02d.pickle", 4*1024**2)
pickle.dump(big_object, dest)

После запуска примера имеем:

$ ls -l *.pickle
-rwxrwx---+ 1 Sasha None 4194304 Dec  4 16:02 data.part00.pickle
-rwxrwx---+ 1 Sasha None 4194304 Dec  4 16:02 data.part01.pickle
-rwxrwx---+ 1 Sasha None 4194304 Dec  4 16:02 data.part02.pickle
-rwxrwx---+ 1 Sasha None 4194304 Dec  4 16:02 data.part03.pickle
-rwxrwx---+ 1 Sasha None 4194304 Dec  4 16:02 data.part04.pickle
-rwxrwx---+ 1 Sasha None  294912 Dec  4 16:02 data.part05.pickle
...