Python:关闭程序后如何保持内存中的数据

3 投票
2 回答
545 浏览
提问于 2025-04-18 09:01

我在代码里有几个很大的属性,每个大约有4MB。当我在Eclipse里启动应用程序时,程序需要从文件中加载所有这些属性。这大概需要30秒。有没有办法把这些属性保存在内存里,这样每次运行程序就不用等30秒了?

我觉得在C语言中使用指针可能可以实现这个。

谢谢大家的建议。

2 个回答

2

这里有个简单的解决办法。我们有一个外部的程序,它负责管理一个比较贵重的资源,同时引入一个可以使用这个资源的模块。这个模块的代码可以被修改,然后重新加载,而外部程序仍然在运行,并且继续管理着这个贵重的资源。

main.py

# importlib for python 3, not needed for 2
#import importlib
expensive_data = [1, 2, 3, 4]

# need to import successfully before using importlib.reload()
import usedata
while(True):
    raw_input("waiting")
    # use this for python 3
    #importlib.reload(usedata)
    # and this for python 2
    reload(usedata)
    usedata.func(expensive_data)

usedata.py

def func(data):
    print [i+2 for i in data]

#def func(data):
#    print [i+3 for i in data]

作为测试,你可以启动main.py,然后通过更改usedata.py中被注释掉的函数,来切换使用的函数。

2

你不能通过C语言的指针来实现这个功能。当程序结束时,它所占用的内存会被释放掉,其他资源,比如打开的文件和数据库连接,也会被关闭。

你可以考虑设置一个内存缓存服务器。可以使用memcached,正如John Barca所建议的,我个人更喜欢用Redis,详细信息可以查看http://redis.io/

不过要记住,memcached和redis主要是帮助提高文件读取的速度。你有多少个4MB的属性呢?在现代电脑上,加载一个4MB的文件应该是瞬间完成的。可能你的程序在解析从文件中读取的属性时花费了时间,这种情况下,你可以使用像pickle这样的工具来保存和加载对象。你的程序应该有一些逻辑来比较你保存的文件和原始数据文件的时间戳,从而决定从哪个来源加载数据。

撰写回答