【问题标题】:Exchange Time for Memory in PythonPython中的内存交换时间
【发布时间】:2014-08-18 19:49:27
【问题描述】:

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

什么编码会指示 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() 函数,或者可能会缓冲或排队输入。

【问题讨论】:

  • LocalAudioFile 是否将文件加载到内存中?看起来您的代码一次只在内存中保留一个文件(当前文件),每次循环加载一个新文件。
  • 您是否尝试过在循环的每次迭代中触发gc.collect
  • 另外,您使用的是什么机器,即 32 位还是 64 位?还有什么操作系统?可能是其他人可以按照他们的方式管理它。我仍然很高兴,但只是为了帮助您解决内存不足的问题,我假设您有。
  • 好吧,我的开发操作系统是 osx 64 位 (sysctl hw.cpu64bit_capable returns 1),但我希望解决方案是可移植的 - 计划托管 *NIX,可能使用 Linode。并且已经超过了 1GB 计划的内存限制。
  • @tobias_k 昨天尝试了 gc.collect (现在又一次),它似乎不会影响循环中发生的内存抓取。

标签: python lazy-loading lazy-evaluation


【解决方案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

【讨论】:

  • 现在要查找多处理模块,但我应该可以在这里用glob.glob('*.mp3') 代替glob.glob('q*.py') 还是我误解了解决方案?
  • @MikeiLL 是的,glob.glob('*.mp3') 很好。玩得开心!
  • 这真的很有趣。 KeyboardInterrupt 不是 stopping 进程。我猜是因为它只是停止了一次处理调用。使用 osX Activity Monitor 来实现。
  • 信号和多处理真的不喜欢对方
  • 让串行版本工作,处理单个音频(小)音频文件。然后将其扩展为处理多个文件或单个大文件。随着进展,事情会变得更加清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
相关资源
最近更新 更多