2009-10-05 26 views
5

Tôi đang làm việc với các ma trận lớn, vì vậy tôi đang sử dụng bản ghi nhớ của NumPy. Tuy nhiên, tôi nhận được một lỗi như là rõ ràng các mô tả tập tin được sử dụng bởi memmap không được đóng lại.NumPy và memmap: [Errno 24] Quá nhiều tệp đang mở

import numpy 
import tempfile 

counter = 0 
while True: 
    temp_fd, temporary_filename = tempfile.mkstemp(suffix='.memmap') 
    map = numpy.memmap(temporary_filename, dtype=float, mode="w+", shape=1000) 
    counter += 1 
    print counter 
    map.close() 
    os.remove(temporary_filename) 

Từ những gì tôi hiểu, tệp memmap được đóng khi phương thức close() được gọi. Tuy nhiên, các mã trên có thể không lặp mãi mãi, vì nó cuối cùng ném "[Errno 24] Quá nhiều tập tin mở" lỗi:

1016 
    1017 
    1018 
    1019 
    Traceback (most recent call last): 
     File "./memmap_loop.py", line 11, in <module> 
     File "/usr/lib/python2.5/site-packages/numpy/core/memmap.py", line 226, in __new__ 
    EnvironmentError: [Errno 24] Too many open files 
    Error in sys.excepthook: 
    Traceback (most recent call last): 
     File "/usr/lib/python2.5/site-packages/apport_python_hook.py", line 38, in apport_excepthook 
    ImportError: No module named packaging_impl 

    Original exception was: 
    Traceback (most recent call last): 
     File "./memmap_loop.py", line 11, in <module> 
     File "/usr/lib/python2.5/site-packages/numpy/core/memmap.py", line 226, in __new__ 
    EnvironmentError: [Errno 24] Too many open files 

Không ai biết những gì tôi đang nhìn ra?

Trả lời

4

Vì bản ghi nhớ không lấy bộ mô tả tệp mở, nhưng tên tệp, tôi cho rằng bạn đã làm rò rỉ bộ mô tả tệp temp_fd. os.close(temp_fd) có trợ giúp không?


Tuyệt vời khi nó hoạt động.

Vì bạn có thể truyền numpy.memmap một đối tượng giống như tệp, bạn có thể tạo một từ bộ mô tả tệp bạn đã có, temp_fd.

fobj = os.fdopen(temp_fd, "w+") 
numpy.memmap(fobj, ... 
+0

Nó giúp. Nó đang làm việc bây giờ. Cảm ơn. – plok

Các vấn đề liên quan