【问题标题】:python make huge file persist in memorypython使巨大的文件保留在内存中
【发布时间】:2015-04-27 23:31:47
【问题描述】:

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

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

【问题讨论】:

  • 该文件可能已经在 OS 缓存中,时间被 unpickling 占用。看起来这个应用程序不是为可扩展性而设计的。像数据库这样更好的后端将是一个开始。
  • 伙计们至少告诉我为什么我被否决了?我最终会到达那里
  • 我可能会使用logstash ...虽然pickle.load很慢...至少使用simplejson.load

标签: python pandas pickle


【解决方案1】:

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

【讨论】:

  • 相对于它的大小加载文件还不错,问题是每次脚本运行时都加载它。
【解决方案2】:

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

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

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

【讨论】:

  • 我正在测试我将部署为服务的文件缓存脚本。并测试将文件转换为 Sqlite
【解决方案3】:

您说的是对大型数组进行内存缓存,本质上是……?

对于大型数组,有三个相当可行的选择:

  1. 使用memory-mapped arrays
  2. 使用h5pypytables 作为后端
  3. 使用数组缓存感知包,如kleptojoblib

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多