我有两个文件,data.py和interpreter .py.
data.py:
X = cPickle.load(open("X","r"))
interpret.py:
from data import X
query = raw_input("Enter query")
#do something with query and X
对象X,它非常大。我用cPickle倾倒了它。interpreter .py将被另一个程序调用,并且由于import当前的工作方式,每次执行interpreter .py时,它都会加载data.py,该py加载X,并且由于X非常大,因此需要花费大量时间。
我希望能做这样的事情。
data.py:
from time import sleep
X = cPickle.load(open("X","r"))
sleep(10**10) #Sleep for eternity
然后运行data.py
interpret.py:
from data import X #import from live instance of data.py
#don't load X all over again
query = raw_input("Enter query")
#do something with query and X
我该怎么做?如果不能从活动实例导入,是否有其他方法可以执行我想要执行的操作。我沟通的不是很好,请告诉我你不明白的地方,我会尽量进一步澄清
据我所知,您想要运行一个守护进程。例如,数据将作为一个独立的守护进程运行,而不是从interpret中导入数据,interpreter将通过套接字之类的东西与之通信。
但是在这一点上,你基本上已经写了一个数据库,所以为什么不把你拥有的任何数据转换成一些数据库,并与数据库通信呢?
编辑:问题是,你想要的巨大的对象之间的进程持续存在,但它不能像那样工作。每次调用explain时,都会生成一个新进程,这意味着无法访问前一个进程生成的对象。这就是为什么守护进程(和数据库)存在。
要让它以你想要的方式工作,你需要保持你的整个Python程序运行,而不是让你的其他程序每次执行解释器。py作为一个脚本,你需要设置它,使解释器。py执行一次,每次你的程序需要进行查询时,它使用现有的实例。py程序。
你可以对interpreter .py:
这样做from data import X
while True:
query = raw_input("Enter query")
#do something with query and X
另一个程序可以在每次需要进行查询时,向正在运行的interpreter .py程序的stdin中写入一行。