如何将大型通用 Python 对象拆分为块
How to split a large generic Python object into chunks
我有一个大型通用 Python 对象,但我没有相关信息。
我需要将这个对象拆分成更小的块以满足存储需求。
Omer,希望有人能提供帮助。
pickle
它并拆分结果数据。
你不能只序列化一个对象的 "a part" 因为在一般情况下没有 "a part of an object" 这样的东西,你需要了解它的内部结构才能将它分成几个部分 - - 你说你没有。
但是,您可以使用 pickle.dump
(写入类似文件的对象)并向其传递一个自定义的类似文件的对象,该对象会在接收结果数据时拆分结果数据。
例如这是一个类似文件的对象,它将数据写入 2GiB 块中的文件(在示例中,我将块大小设置为 4MiB):
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
我有一个大型通用 Python 对象,但我没有相关信息。 我需要将这个对象拆分成更小的块以满足存储需求。
Omer,希望有人能提供帮助。
pickle
它并拆分结果数据。
你不能只序列化一个对象的 "a part" 因为在一般情况下没有 "a part of an object" 这样的东西,你需要了解它的内部结构才能将它分成几个部分 - - 你说你没有。
但是,您可以使用 pickle.dump
(写入类似文件的对象)并向其传递一个自定义的类似文件的对象,该对象会在接收结果数据时拆分结果数据。
例如这是一个类似文件的对象,它将数据写入 2GiB 块中的文件(在示例中,我将块大小设置为 4MiB):
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