我有一个python脚本需要将一个巨大的文件读入var然后搜索到它并执行其他的东西,
问题是Web服务器多次调用此脚本,并且每次在文件加载时我都有大约8秒的延迟。
是否有可能使文件在内存中保留以便更快地访问它?
我知道我可以使用supervisor
将脚本作为服务,但我不能这样做。
请提出其他建议。
PS我已经在使用var = pickle.load(open(file))
答案 0 :(得分:0)
你应该看看http://docs.h5py.org/en/latest/。它允许对大型文件执行各种操作。这就是NASA使用的。
答案 1 :(得分:0)
不是一个简单的问题。我假设您无法对Web服务器多次调用您的应用程序这一事实做任何事情。在这种情况下,我看到两个解决方案:
(1)写两个单独的申请。第一个应用程序A加载大文件然后它就在那里,等待另一个应用程序访问数据。 “A”根据需要提供访问权限,因此它基本上是一种自定义服务器。第二个应用程序B是由Web服务器多次调用的应用程序。在每次调用时,它使用某种形式的进程间通信从A中提取必要的数据。这应该相对较快。 Python标准库提供了一些用于进程间通信的工具(套接字,http服务器),但它们是相当低级的。替代方案几乎肯定会依赖于操作系统。
(2)也许你可以预先消化或预分析大文件,写出一个可以快速加载的更紧凑的文件。 tdelaney在他的评论(某种数据库安排)中提出了类似的想法。
答案 2 :(得分:0)
你在谈论内存缓存一个大型数组,基本上......?
大型阵列有三种相当可行的选项:
h5py
或pytables
作为后端klepto
或joblib
的数据缓存感知包。内存映射数组将数组索引到文件中,就像内存中一样。
h5py
或pytables
可让您快速访问磁盘上的阵列,还可以避免将整个阵列加载到内存中。 klepto
和joblib
可以将数组存储为“数据库”条目的集合(通常是磁盘上文件的目录树),因此您可以轻松地将数组的部分内容加载到内存中。每个都有不同的用例,因此最适合您的选择取决于您想要做什么。 (我是klepto
作者,它可以使用SQL数据库表作为后端而不是文件。)