gpt4 book ai didi

python - 如何从日志文件加载所有 cPickle 转储?

转载 作者:太空宇宙 更新时间:2023-11-03 19:12:49 24 4
gpt4 key购买 nike

我将运行代码,将大量(~1000)个相对较小(50 个键:值对字符串)的字典写入日志文件。我将通过一个自动执行此操作的程序来完成此操作。我正在考虑运行如下命令:

import random
import string
import cPickle as pickle
import zlib

fieldNames = ['AICc','Npix','Nparameters','DoF','chi-square','chi-square_nu']

tempDict = {}
overview = {}
iterList = []

# Create example dictionary to add to the log.
for item in fieldNames:
tempDict[item] = random.choice([random.uniform(2,5), '', ''.join([random.choice(string.lowercase) for x in range(5)])])

# Compress and pickle and add the example dictionary to the log.
# tried with 'ab' and 'wb'
# is .p.gz the right extension for this kind of file??
# with open('google.p.gz', 'wb') as fp:
with open('google.p.gz', 'ab') as fp:
fp.write(zlib.compress(pickle.dumps(tempDict, pickle.HIGHEST_PROTOCOL),9))

# Attempt to read in entire log
i = 0
with open('google.p.gz', 'rb') as fp:
# Call pickle.loads until all dictionaries loaded.
while 1:
try:
i += 1
iterList.append(i)
overview[i] = {}
overview[i] = pickle.loads(zlib.decompress(fp.read()))
except:
break

print tempDict
print overview

我希望能够加载写入日志文件 (google.p.gz) 的最后一个字典,但它目前仅加载第一个 pickle.dump

此外,有没有更好的方法来完成我正在做的所有事情?我环顾四周,感觉好像我是唯一一个做这样的事情的人,而且我发现这在过去是一个坏兆头。

最佳答案

您的输入和输出不匹配。当您输出记录时,您单独获取每条记录,对其进行 pickle ,压缩,然后将结果单独写入文件:

fp.write(zlib.compress(pickle.dumps(tempDict, pickle.HIGHEST_PROTOCOL),9))

但是当您输入记录时,您会读取整个文件,将其解压缩,然后从中取出单个对象:

pickle.loads(zlib.decompress(fp.read()))

因此,下次调用 fp.read() 时,将不再有任何内容:您第一次读取了整个文件。

所以你必须将你的输入与你的输出相匹配。如何执行此操作取决于您的具体要求。假设您的要求是:

  1. 记录太多,需要将文件压缩到磁盘上。

  2. 所有记录都会一次性写入文件(您无需附加单独的记录)。

  3. 您不需要随机访问文件中的记录(您总是乐意读取整个文件以便找到最后一条记录)。

根据这些要求,使用 zlib 单独压缩每条记录是一个坏主意。 。 DEFLATE algorithm zlib 使用的方法是查找重复序列,因此最适合大量数据。对于单条记录来说它不会有太大作用。所以让我们使用gzip压缩和解压缩整个文件的模块。

在检查您的代码时,我对它进行了一些其他改进。

import cPickle as pickle
import gzip
import random
import string

field_names = 'AICc Npix Nparameters DoF chi-square chi-square_nu'.split()

random_value_constructors = [
lambda: random.uniform(2,5),
lambda: ''.join(random.choice(string.lowercase)
for x in xrange(random.randint(0, 5)))]

def random_value():
"""
Return a random value, either a small floating-point number or a
short string.
"""
return random.choice(random_value_constructors)()

def random_record():
"""
Create and return a random example record.
"""
return {name: random_value() for name in field_names}

def write_records(filename, records):
"""
Pickle each record in `records` and compress them to `filename`.
"""
with gzip.open(filename, 'wb') as f:
for r in records:
pickle.dump(r, f, pickle.HIGHEST_PROTOCOL)

def read_records(filename):
"""
Decompress `filename`, unpickle records from it, and yield them.
"""
with gzip.open(filename, 'rb') as f:
while True:
try:
yield pickle.load(f)
except EOFError:
return

关于python - 如何从日志文件加载所有 cPickle 转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12381471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com