@@ -366,7 +366,7 @@ def from_omx(
366366
367367 arrays = {}
368368 filename = omx_file_name (omx )
369- if filename is not None :
369+ if _is_reopenable ( filename ) :
370370 # fast path: parallel chunk decoding via h5py
371371 import concurrent .futures
372372
@@ -442,6 +442,24 @@ def _fast_load_omx_array(filename, name):
442442 return omx_reader .read_dataset (f ["data" ][name ])
443443
444444
445+ def _is_reopenable (filename ) -> bool :
446+ """Check whether a file can be independently opened for reading with h5py.
447+
448+ Reopening can fail if the file name is unknown (e.g. an in-memory file),
449+ or if the file is already open elsewhere in a mode that locks it.
450+ """
451+ if filename is None :
452+ return False
453+ import h5py
454+
455+ try :
456+ with h5py .File (filename , "r" ):
457+ pass
458+ except Exception : # noqa: BLE001
459+ return False
460+ return True
461+
462+
445463def from_omx_3d (
446464 omx : openmatrix .File | str | Iterable [openmatrix .File | str ],
447465 index_names = ("otaz" , "dtaz" , "time_period" ),
@@ -538,18 +556,20 @@ def from_omx_3d(
538556 omx_data_map [k ] = n
539557
540558 omx_filenames = [omx_file_name (i ) for i in omx ]
559+ omx_reopenable = [_is_reopenable (i ) for i in omx_filenames ]
541560
542561 import dask .array
543562
544563 def _lazy_omx_array (k ):
545564 # Build a lazy dask array for one matrix table. When the source
546- # file is on disk, defer to the parallel chunk-decoding reader;
547- # otherwise fall back to wrapping the open file handle's node.
565+ # file can be independently reopened, defer to the parallel
566+ # chunk-decoding reader; otherwise read the data eagerly, as the
567+ # open file handle may be closed before the dask graph is computed.
548568 n = omx_data_map [k ]
549569 filename = omx_filenames [n ]
550570 node = omx_data [n ][k ]
551- if filename is None :
552- return dask .array .from_array (node )
571+ if not omx_reopenable [ n ] :
572+ return dask .array .from_array (np . asarray ( node [:]) )
553573 return dask .array .from_delayed (
554574 dask .delayed (_fast_load_omx_array )(filename , k ),
555575 shape = tuple (node .shape ),
0 commit comments