一种高效的方式,为“用户”生成内容;假;python中的类文件对象

一种高效的方式,为“用户”生成内容;假;python中的类文件对象,python,performance,Python,Performance,在测试代码中,我将下面类似文件的对象的实例传递给一个函数,该函数通常需要一个文件。该函数使用一系列8KB的read()函数上载内容 它工作正常,使用一致但不断变化的数据模拟文件内容(“0123456789abcdef0123…”) 问题是它速度慢,而且似乎占用了大量内存——它会被OOM杀手杀死。我猜read()返回的8K字符串不够快 无论如何,我不想增加这个测试的内存需求,也不想使用固定大小的预分配字符串 发现一篇旧文章,指出这是最好的方法,但请分享关于如何更有效地做到这一点的任何想法 clas

在测试代码中,我将下面类似文件的对象的实例传递给一个函数,该函数通常需要一个文件。该函数使用一系列8KB的read()函数上载内容

它工作正常,使用一致但不断变化的数据模拟文件内容(“0123456789abcdef0123…”)

问题是它速度慢,而且似乎占用了大量内存——它会被OOM杀手杀死。我猜read()返回的8K字符串不够快

无论如何,我不想增加这个测试的内存需求,也不想使用固定大小的预分配字符串

发现一篇旧文章,指出这是最好的方法,但请分享关于如何更有效地做到这一点的任何想法

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超过某个测试健全性编号,则可能需要出错。