Я выполняю какой-то «смущающий параллель» код Python в кластере и хочу сохранить массивы в nnpy-файлах таким образом, чтобы каждый файл представлял точку данных (одномерный массив), которая регулярно обновляется (то есть становитсяболее статистически значимо);идея состоит в том, чтобы минимизировать усилия пост-обработки. Я пытаюсь использовать MPI для доступа к случайным файлам в наборе возможных файлов, возможно одновременно.
Я пытаюсь использовать метод MPI.File.Open(comm, filename, amode, info, fh)
из mpi4py
.
* 1006. *
В документации говорится, что отдельные процессы могут открывать файл независимо с MPI.COMM_SELF в качестве внутрикоммуникатора. Когда я пытаюсь сделать это вместе с np.save, я получаю TypeError:
Traceback (most recent call last):
File "/nas/longleaf/apps/python/3.5.1/lib/python3.5/site-packages/numpy/compat/py3k.py", line 229, in os_fspath
path_repr = path_type.__fspath__(path)
AttributeError: type object 'mpi4py.MPI.File' has no attribute '__fspath__'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "simpleMPItest.py", line 112, in <module>
main()
File "simpleMPItest.py", line 35, in main
np.save(fh,np.random.rand(1))
File "/nas/longleaf/apps/python/3.5.1/lib/python3.5/site-packages/numpy/lib/npyio.py", line 514, in save
file = os_fspath(file)
File "/nas/longleaf/apps/python/3.5.1/lib/python3.5/site-packages/numpy/compat/py3k.py", line 237, in os_fspath
"not " + path_type.__name__)
TypeError: expected str, bytes or os.PathLike object, not File
Проходя трассировку:
File "/nas/longleaf/apps/python/3.5.1/lib/python3.5/site-packages/numpy/lib/npyio.py", line 514, in save
file = os_fspath(file)
мы получаем этот блок:
own_fid = False
if hasattr(file, 'read'):
fid = file
else:
file = os_fspath(file) #line 514
if not file.endswith('.npy'):
file = file + '.npy'
fid = open(file, "wb")
own_fid = True
if sys.version_info[0] >= 3:
pickle_kwargs = dict(fix_imports=fix_imports)
else:
# Nothing to do on Python 2
pickle_kwargs = None
try:
arr = np.asanyarray(arr)
format.write_array(fid, arr, allow_pickle=allow_pickle,
pickle_kwargs=pickle_kwargs)
finally:
if own_fid:
fid.close()
Проблема в том, что когда я передаю MPI-файл в np.save, объект MPI-файла не имеет атрибута «read», npyio.py
пытается изменить его, поскольку предполагает, что это не файловый объект, что приводит кОшибка типа.
Печать атрибутов файла MPI:
['Call_errhandler', 'Close', 'Delete', 'Get_amode', 'Get_atomicity', 'Get_byte_offset', 'Get_errhandler', 'Get_group', 'Get_info', 'Get_position', 'Get_position_shared', 'Get_size', 'Get_type_extent', 'Get_view', 'Iread', 'Iread_all', 'Iread_at', 'Iread_at_all', 'Iread_shared', 'Iwrite', 'Iwrite_all', 'Iwrite_at', 'Iwrite_at_all', 'Iwrite_shared',
'Open', 'Preallocate', 'Read', 'Read_all', 'Read_all_begin', 'Read_all_end', 'Read_at',
'Read_at_all', 'Read_at_all_begin', 'Read_at_all_end', 'Read_ordered', 'Read_ordered_begin', 'Read_ordered_end', 'Read_shared', 'Seek', 'Seek_shared', 'Set_atomicity', 'Set_errhandler', 'Set_info', 'Set_size', 'Set_view', 'Sync',
'Write', 'Write_all', 'Write_all_begin', 'Write_all_end', 'Write_at', 'Write_at_all', 'Write_at_all_begin', 'Write_at_all_end', 'Write_ordered', 'Write_ordered_begin', 'Write_ordered_end', 'Write_shared', '__bool__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'amode', 'atomicity', 'f2py', 'group', 'info', 'py2f', 'size']
показывает, что файлы MPI имеют атрибуты «Чтение» и «Запись». Это поднимает еще одну проблему, когда я добираюсь до этого блока:
try:
arr = np.asanyarray(arr)
format.write_array(fid, arr, allow_pickle=allow_pickle,
pickle_kwargs=pickle_kwargs)
, потому что format.write_array()
получает file_like_object с методом .write()
.
Могу ли я дать объект файла MPI .read()
и .write()
методы? Я не думаю, что смогу внести какие-либо изменения в npyio.py
, потому что это университетский кластер.