2017-06-22 33 views
1

當memmap數組被垃圾收集時,是否有可能刪除Numpy memmap文件?帶有文件刪除的Numpy memmap

我曾嘗試:

import tempfile 
import numpy as np 
arr = np.memmap(tempfile.NamedTemporaryFile(), mode='w+', 
       shape=(10, 10), dtype=np.int) 
os.path.exists(arr.filename) # False 

但它出現在參照臨時文件並非保持被刪除。

我不想在臨時文件上使用上下文管理器,因爲我希望能夠從函數中返回數組,並讓文件處於活動狀態,直到數組不再使用。

注意:類似的問題在這裏:In Python, is it possible to overload Numpy's memmap to delete itself when the memmap object is no longer referenced?但提問者展示了對Python範圍和tempfile模塊的瞭解。

+0

看起來'tempfile'和'memmap'之間存在一些棘手的相互作用。如果臨時文件是首先創建的,或者我使用自己的文件名,那麼這個文件就存在於'os.path'和一個OS文件管理器中。創建你的方式文件可能不存在於內存緩衝區之外。還可以用'delete = False'進行實驗。 – hpaulj

+1

它看起來像你關於鏈接SO的簡短討論回答你的問題。這一切都與操作系統的交互以及'tempfile'如何創建文件有關。 – hpaulj

回答

0

事實證明,原來連接的問題jtaylor's answer是正確的。所以代碼:

import tempfile 
import numpy as np 
with tempfile.NamedTemporaryFile() as ntf: 
    temp_name = ntf.name 
    arr = np.memmap(ntf, mode='w+', 
        shape=(10, 10), dtype=np.int) 
print(arr) 

根據需要工作,即使os.path.exists(temp_name)是錯誤的,因爲操作系統管理文件的方式。文件路徑(temp_name)未鏈接,不再可通過文件系統訪問,但實際的文件磁盤使用率將保持可用,直到關閉打開的文件(memmap對象將保留該文件)。