簡體   English   中英

python使巨大的文件保留在內存中

[英]python make huge file persist in memory

我有一個python腳本,需要將一個巨大的文件讀入var,然后搜索它並執行其他操作,問題是Web服務器多次調用此腳本,並且每次我有大約8秒鍾的延遲時,文件加載。 是否可以使文件保留在內存中,以便在以后更快地訪問它? 我知道我可以使用supervisor將腳本作為服務來supervisor但是我不能為此做。

還有其他建議。 PS我已經在使用var = pickle.load(open(file))

您應該看看http://docs.h5py.org/en/latest/ 它允許對大型文件執行各種操作。 這就是NASA的用途。

這不是一個簡單的問題。 我假設您無法對Web服務器多次調用應用程序這一事實做任何事情。 在這種情況下,我看到兩個解決方案:

(1)編寫兩個單獨的應用程序。 第一個應用程序A加載大文件,然后將其放在那里,等待其他應用程序訪問數據。 “ A”根據需要提供訪問權限,因此它基本上是一種定制服務器。 第二個應用程序B是Web服務器多次調用的應用程序。 在每次調用時,它使用某種形式的進程間通信從A中提取必要的數據。 這應該相對較快。 Python標准庫提供了一些用於進程間通信的工具(套接字,http服務器),但是它們是底層的。 幾乎可以肯定,替代方案將取決於操作系統。

(2)也許您可以預先消化或預先分析大文件,寫出可以快速加載的更緊湊的文件。 tdelaney在他的評論(某種數據庫安排)中提出了類似的想法。

您實際上是在談論對大型數組進行內存緩存的方法……?

對於大型陣列,有三個相當可行的選擇:

  1. 使用內存映射數組
  2. 使用h5pypytables作為后端
  3. 使用數組緩存感知包,例如kleptojoblib

內存映射的數組對文件中的數組進行索引,就像在內存中一樣。 h5pypytables使您可以快速訪問磁盤上的陣列,還可以避免將整個陣列加載到內存中。 kleptojoblib可以將陣列存儲為“數據庫”條目的集合(通常是磁盤上文件的目錄樹),因此您可以輕松地將陣列的某些部分加載到內存中。 每個案例都有不同的用例,因此最佳選擇取決於您要執行的操作。 (我是klepto作者,它可以將SQL數據庫表用作后端而不是文件)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM