我需要存储和处理大量非常长的数字,范围从 0 到 f 64 次(ffffffffff .....ffff)。
如果我将这些数字存储在文件中,每个字符(数字)需要 1 个字节 +\n 符号需要 2 个字节 = 最多 66 个字节。然而,为了表示所有可能的数字,我们不需要超过 34 个字节(4 位表示从 0 到 f 的数字,因此 4 [位] * 64 [十六进制数字的数量]/8 [字节中的位 a] = 32 字节 +\n ,当然)。
有没有什么方法可以在不消耗过多内存的情况下存储数字?
到目前为止,我已经创建了从十六进制(每个符号 16 位数字)到基数为 76 的数字(十六进制 + 所有字母和一些其他符号)的转换器,这将数字的大小减少到 41 + 2 个字节。
请您参考如下方法:
您正在尝试存储 32 个字节长。为什么不将它们存储为二进制数呢?这样你只需要为每个数字存储 32 个字节,而不是 41 个或其他。您可以添加各种准压缩方案,以利用诸如您的大多数数字都短于 32 字节之类的东西。
如果您的数字是字符串,请先将其转换为 int。 Python3 int 基本上是无限精度的,所以你不会丢失任何信息:
>>> num = '113AB87C877AAE3790'
>>> num = int(num, 16)
>>> num
317825918024297625488
现在您可以将结果转换为字节数组并将其写入为二进制写入打开的文件:
with open('output.bin', 'wb') as file:
file.write(num.to_bytes(32, byteorder='big'))
int 方法 to_bytes将您的数字转换为可以放在文件中的字节串。您需要指定字符串长度和顺序。 'big' 可以更轻松地读取文件的十六进制转储。
读回文件并使用int.from_bytes解码它以类似的方式:
with open('output.bin', 'rb') as file:
bytes = file.read(32)
num = int.from_bytes(bytes, byteorder='big')
请记住始终在文件模式中包含 b,否则如果您尝试读取或写入包含 \n 代码的数据,您可能会遇到意想不到的问题.
理所当然的,读写操作都可以循环
