【问题标题】:thread and exception safe way of using HDFStore files使用 HDFStore 文件的线程和异常安全方式
【发布时间】:2014-03-02 05:31:24
【问题描述】:

以下代码sn-p:

    HDFStore = pandas.io.pytables.HDFStore
    lock = threading.RLock()
    with lock:
        store = HDFStore('my_datafile.hdf','r')
        data_frame = store['my_series']
        store.close()
    return data_frame['my_column']

是为了响应web请求而执行的,所以它可能同时在多个线程上执行。也有可能在调用 store.close 之前就中断了执行。

我遇到了一些无法重现的问题(HDFStore 库中的异常或返回的空数据)。

使此代码线程安全并确保文件在异常时正确关闭的正确方法是什么?

通过一些调查,我发现 HDFStore 具有用于打开文件的缓存机制......也许这可能是问题所在?

【问题讨论】:

    标签: python multithreading pandas pytables hdfstore


    【解决方案1】:

    参考pandasdocs

    然后发布 PyTables 3.1 release notes

    应该在 PyTables 3.0.0 上工作。只要您不在其他任何地方写入文件(因为它已经存在)。

    您也可以尝试这样做:

    with get_store('my_datafile.hdf',mode='r') as store:
        return store['my_series']
    

    它会自动为你关闭它(我不认为这是线程安全的,但也许如果你把它放在你的 with lock: 中它会是线程安全的。

    如果您只是阅读,那么您根本不关心线程安全。 在任何情况下都不要尝试在多个线程(甚至进程)中写入。这会炸毁你的文件。

    PyTables 3.1 刚刚发布,至少在较低的 HDF5 版本上更改了文件缓存机制,请查看您的版本:

    import tables
    tables.get_hdf_version()
    

    我不知道这会对线程安全性产生什么影响。

    【讨论】:

    • 我想我有 pytables 版本 2.3.1('module' 对象没有属性 'get_hdf_version')。在 3.1 发行说明中它说:“PyTables 不再使用共享/缓存文件处理程序。这一变化在一定程度上改进了对并发读取的支持,允许用户在不同线程中安全地打开同一个文件进行读取”所以,也许,有一个严重的并发阅读也有问题。
    • 也非常感谢您指出并发写入的风险(即使在我的情况下不太可能,它也会具有破坏性!)。您认为写入临时文件然后将临时文件移动(mv)到目标文件是否安全?还是使用锁(线程和/或进程)会更好?
    • 并发阅读在多线程/进程中工作得很好。 3.1 中的更改更多是为了使 PyTables 与底层 HDF5 协议的工作方式保持一致。也就是说,它可能在 中有错误
    • 您可以从单个进程/线程写入单个唯一文件,没问题。只是不要尝试写入 same 文件,即使是具有多个进程/线程的不同节点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多