Python中的内存交换时间

时间:2014-08-18 19:49:27

标签: python lazy-loading lazy-evaluation

这里的挑战是评估多个大文件。

什么编码会指示Python将有限数量的文件“加载”到内存中,处理它们,垃圾收集然后加载下一组?

def main(directory):
    """
    Create AudioAnalysis Objects from directory and call object_analysis().
"""   
    ff = os.listdir(directory)
    for f in ff:
        # can we limit the number we load at one time?
        audiofile = audio.LocalAudioFile(os.path.join(directory,f)) # hungry!

尝试将audiofile = 0添加到循环中,但内存分配是相同的。

根据我的理解,Lazy Evaluation“是一种评估策略,它延迟表达式的评估,直到需要它的值”,但在这种情况下,我需要延迟评估,直到有可用的内存

我希望可能涉及decoratordescriptor和/或使用Pythons property()函数,或者可能缓冲或排队输入。

1 个答案:

答案 0 :(得分:1)

这是一个解决方案:让Python生成一个进程,在一个文件上运行该函数,然后退出。父proc将收集每个文件的结果。

这绝不是优雅的,但如果LocalAudioFile拒绝从记忆中移除,它可以灵活地获得结果。

此代码运行在当前目录中的每个Python文件上运行一个函数,向父进程返回一条消息,将其打印出来。

import glob, multiprocessing, os

def proc(path):
    """
    Create AudioAnalysis Objects from directory and call object_analysis().
"""   
    # audiofile = audio.LocalAudioFile(path) # hungry!
    return 'woot: {}'.format(path)

if __name__=='__main__':  # required for Windows
    pool = multiprocessing.Pool()   # one Process per CPU
    for output in pool.map(proc, [
            os.path.abspath(name) for name in glob.glob('q*.py')
            ]):
        print 'output:',output

输出

output: woot: /home/johnm/src/johntellsall/karma/qpopen.py
output: woot: /home/johnm/src/johntellsall/karma/quotes.py