5

私は大きな行列を扱っているので、NumPyのmemmapを使用しています。ただし、me​​mmapで使用されているファイル記述子が閉じられていないため、エラーが発生します。

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)

私の理解では、メソッドclose()が呼び出されると、memmapファイルは閉じられます。ただし、上記のコードは、最終的に「[Errno 24]開いているファイルが多すぎます」というエラーがスローされるため、永久ループすることはできません。

    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

誰かが私が見落としているものを知っていますか?

4

1 に答える 1

4

memmapは開いているファイル記述子ではなくファイル名を取得するため、ファイル記述子をリークしていると思いますtemp_fdos.close(temp_fd)助けになりますか?


それが機能するのは素晴らしいことです。

numpy.memmapにファイルのようなオブジェクトを渡すことができるので、すでに持っているファイル記述子からオブジェクトを作成できますtemp_fd

fobj = os.fdopen(temp_fd, "w+")
numpy.memmap(fobj, ...
于 2009-10-05T13:42:54.137 に答える