2012-07-21 29 views
3

如何繞過h5py中的磁盤I/O?目前,我必須做這樣的事情:將hdf5文件作爲二進制blob /字符串傳遞給h5py?

msg = socket.recv() 
fp = open("tmp.hdf5", 'wb') 
fp.write(msg) 
fp.close() 
f = h5py.File('tmp.hdf5', 'r') 

... # alter the file 

fp = open("tmp.hdf5", 'rb') 
msg = fp.read() 
msg = f.toString() 
socket.send(data) 

我想要做這樣的事情:

msg = socket.recv() 
f = h5py.File(msg, driver='core') 
... # alter the file 
msg = f.toString() 
socket.send(msg) 

我在這裏的問題是速度 - 磁盤I/O過於龐大的一個瓶頸。有沒有簡單的方法來創建h5py File對象字符串,然後將該文件作爲字符串提取?我願意像Cython一樣,如果它涉及到...

+0

您是否找到解決方案?我現在面臨同樣的問題...... :) – AME 2012-08-16 11:38:17

+0

可能太晚了,但看到接受的答案。 tmpfs將數據放入RAM而不是放在磁盤上。 – KarlC 2013-10-31 14:59:57

回答

2

我敢肯定,這是不可能使用Python,因爲h5py只是一個hdf5 c庫的包裝。 對HDF5數據的每次訪問遲早會以HDF5 c庫調用結束。

你也許可以在os級別上解決這個問題。如果有足夠的可用RAM,則可以將數據文件保存在RAM drive上。在Linux上,通常使用tmpfs創建RAM驅動器。

+0

我最終在序列化之前將hdf5 /總是轉換爲另一種格式。 tmpfs看起來像它會很有希望。 – KarlC 2013-10-31 14:58:03

1

如何繞過h5py中的磁盤I/O?

這裏是一個工作示例:

"""HDF5 in memory file reading example.""" 

try: 
    import contextlib 
    import os 
    import tempfile 

    import h5py 

    hdf5_data = (
     b'\x89HDF\r\n\x1a\n\x00\x00\x00\x00\x00\x08\x08\x00\x04\x00\x10\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff' 
     b'\xff\xff\xff|\x05\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff' 
     b'\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00\x00' 
     b'\x00\x01\x00\x00\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00' 
     b'\xa8\x02\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00\x00\x00\x18' 
     b'\x00\x00\x00\x00\x00\x00\x00\x11\x00\x10\x00\x00\x00\x00\x00\x88\x00' 
     b'\x00\x00\x00\x00\x00\x00\xa8\x02\x00\x00\x00\x00\x00\x00TREE\x00\x00' 
     b'\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' 
     b'\xff\x00\x00\x00\x00\x00\x00\x00\x000\x04\x00\x00\x00\x00\x00\x00' 
     b'\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00HEAP\x00\x00\x00\x00X' 
     b'\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\xc8\x02' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00test\x00\x00' 
     b'\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x01\x00\x06\x00\x01\x00\x00\x00\x00\x01\x00' 
     b'\x00\x00\x00\x00\x00\x01\x00(\x00\x00\x00\x00\x00\x01\x02\x01\x00' 
     b'\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00' 
     b'\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00' 
     b'\x00\x00\x03\x00\x10\x00\x01\x00\x00\x00\x10\x08\x00\x00\x04\x00\x00' 
     b'\x00\x00\x00 \x00\x00\x00\x00\x00\x05\x00\x08\x00\x01\x00\x00\x00' 
     b'\x02\x02\x02\x01\x00\x00\x00\x00\x08\x00\x18\x00\x01\x00\x00\x00\x03' 
     b'\x01x\x05\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x12\x00\x08\x00\x00\x00\x00\x00\x01\x00\x00' 
     b'\x00\xed\xf3\xa1Y\x00\x00p\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00SNOD\x01\x00\x01\x00\x08\x00\x00\x00\x00\x00\x00' 
     b'\x00 \x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
     b'\x00\x00\x00\x00\x00\x00\x0090\x00\x00' 
    ) 

    file_access_property_list = h5py.h5p.create(h5py.h5p.FILE_ACCESS) 
    file_access_property_list.set_fapl_core(backing_store=False) 
    file_access_property_list.set_file_image(hdf5_data) 

    file_id_args = { 
     'fapl': file_access_property_list, 
     'flags': h5py.h5f.ACC_RDONLY, 
     'name': next(tempfile._get_candidate_names()).encode(), 
    } 

    h5_file_args = {'backing_store': False, 'driver': 'core', 'mode': 'r'} 

    with contextlib.closing(h5py.h5f.open(**file_id_args)) as file_id: 
     with h5py.File(file_id, **h5_file_args) as h5_file: 
      assert h5_file['test'][0] == 12345 

    assert not os.path.exists(file_id_args['name']) 

except: 
    print('Something went wrong!') 
    raise 

else: 
    print('It works!! You can read HDF5 in memory!') 

這似乎是一個黑客,但它是什麼,我發現周圍的h5py Github上挖掘時。

assert not os.path.exists(file_id_args['name'])可以看出,儘管我傳遞了一個文件名(它不應該存在於文件系統中),但實際上並沒有創建文件。

參見:

請如果有人知道一少哈克的方式做到這一點還是知道如何簡化我的代碼,只需編輯這個響應或發表評論。

相關問題