这里的挑战是评估多个大文件。
什么编码会指示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
“是一种评估策略,它延迟表达式的评估,直到需要它的值”,但在这种情况下,我需要延迟评估,直到有可用的内存
我希望可能涉及decorator
,descriptor
和/或使用Pythons property()
函数,或者可能缓冲或排队输入。
答案 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