一种高效的方式,为“用户”生成内容;假;python中的类文件对象
在测试代码中,我将下面类似文件的对象的实例传递给一个函数,该函数通常需要一个文件。该函数使用一系列8KB的read()函数上载内容 它工作正常,使用一致但不断变化的数据模拟文件内容(“0123456789abcdef0123…”) 问题是它速度慢,而且似乎占用了大量内存——它会被OOM杀手杀死。我猜read()返回的8K字符串不够快 无论如何,我不想增加这个测试的内存需求,也不想使用固定大小的预分配字符串 发现一篇旧文章,指出这是最好的方法,但请分享关于如何更有效地做到这一点的任何想法一种高效的方式,为“用户”生成内容;假;python中的类文件对象,python,performance,Python,Performance,在测试代码中,我将下面类似文件的对象的实例传递给一个函数,该函数通常需要一个文件。该函数使用一系列8KB的read()函数上载内容 它工作正常,使用一致但不断变化的数据模拟文件内容(“0123456789abcdef0123…”) 问题是它速度慢,而且似乎占用了大量内存——它会被OOM杀手杀死。我猜read()返回的8K字符串不够快 无论如何,我不想增加这个测试的内存需求,也不想使用固定大小的预分配字符串 发现一篇旧文章,指出这是最好的方法,但请分享关于如何更有效地做到这一点的任何想法 clas
class FakeFile():
'''A file-like object that generates a fixed byte stream, so that uploads
can be verified without having a large file on disk.'''
def __init__(self, length = 10 * 1024 * 1024): # 10 megabytes
self.idx = 0
self.length = length
def read(self, size=None):
r = ''
max = self.length - self.idx
if size == None or size > max:
size = max
r = "".join(['%x' % (c%16) for c in range(self.idx, self.idx+size)])
self.idx += size
return r
def readLine(self, size=None): # - read one entire line from the file.
return self.read()
def close(): # - close the file.
pass
def seek(self, i, dir):
import os
if dir==os.SEEK_CUR:
self.idx += i
elif dir==os.SEEK_SET:
self.idx = i
elif dir==os.SEEK_END:
self.idx = self.length - i
else:
raise ValueError()
打得好,用户2357112!此代码速度不快,但它不是OOM的原因。后来发现测试中有一个调用将上传的对象读入内存以验证大小,这就是触发OOM杀手的原因。我将其更改为头部,并验证了内容长度。对不起,谢谢你的阅读
PS:seek(巨大的_数)不使用任何额外内存,字符串仅由read()生成并返回。这件事看起来并不是问题的原因。您的内存问题可能在其他地方。您的
close
方法缺少self
参数。您有什么理由不能使用StringIO(或cStringIO)吗?对于这个用例来说似乎是合理的。您的搜索需要确保idx永远不会低于零。有可能把它炸掉。您可以记录为调试而发生的读取,可能是您在其他内容中发现了无法释放返回字符串的错误。假设代码执行了seek(1000000000000)
。那会把它炸了。如果seek超过某个测试健全性编号,则可能需要出错。