python使巨大的文件在内存中持久存在

时间:2015-04-27 23:31:47

标签: python pandas pickle

我有一个python脚本需要将一个巨大的文件读入var然后搜索到它并执行其他的东西, 问题是Web服务器多次调用此脚本,并且每次在文件加载时我都有大约8秒的延迟。 是否有可能使文件在内存中保留以便更快地访问它? 我知道我可以使用supervisor将脚本作为服务,但我不能这样做。

请提出其他建议。 PS我已经在使用var = pickle.load(open(file))

3 个答案:

答案 0 :(得分:0)

你应该看看http://docs.h5py.org/en/latest/。它允许对大型文件执行各种操作。这就是NASA使用的。

答案 1 :(得分:0)

不是一个简单的问题。我假设您无法对Web服务器多次调用您的应用程序这一事实做任何事情。在这种情况下,我看到两个解决方案:

(1)写两个单独的申请。第一个应用程序A加载大文件然后它就在那里,等待另一个应用程序访问数据。 “A”根据需要提供访问权限,因此它基本上是一种自定义服务器。第二个应用程序B是由Web服务器多次调用的应用程序。在每次调用时,它使用某种形式的进程间通信从A中提取必要的数据。这应该相对较快。 Python标准库提供了一些用于进程间通信的工具(套接字,http服务器),但它们是相当低级的。替代方案几乎肯定会依赖于操作系统。

(2)也许你可以预先消化或预分析大文件,写出一个可以快速加载的更紧凑的文件。 tdelaney在他的评论(某种数据库安排)中提出了类似的想法。

答案 2 :(得分:0)

你在谈论内存缓存一个大型数组,基本上......?

大型阵列有三种相当可行的选项:

  1. 使用memory-mapped arrays
  2. 使用h5pypytables作为后端
  3. 使用类似于kleptojoblib的数据缓存感知包。
  4. 内存映射数组将数组索引到文件中,就像内存中一样。 h5pypytables可让您快速访问磁盘上的阵列,还可以避免将整个阵列加载到内存中。 kleptojoblib可以将数组存储为“数据库”条目的集合(通常是磁盘上文件的目录树),因此您可以轻松地将数组的部分内容加载到内存中。每个都有不同的用例,因此最适合您的选择取决于您想要做什么。 (我是klepto作者,它可以使用SQL数据库表作为后端而不是文件。)