Python multiprocessing多进程编程时读取hdf5文件遇到OSError: Unable to open file的解决方法

近期在处理大批量数据的时候有一种情况是,利用multiprocessing进行并行时,需要从hdf5文件中读取几个大的dataframe。例如以下代码

import pandas as pd
import multiprocessing as mul


def patent_match(x):
    store = pd.HDFStore('./data/example_data.h5', 'r')
    foo = store['foo']
    


if __name__ == '__main__':
    pool_num = 10 #进程数量
    num_list = [1,2,3,4] #样例数据
    pool = mul.Pool(pool_num)
    pool.map(patent_match, num_list)
    pool.close()
    pool.join()

发现在并行执行时,程序会报OSError,大意是无法获取该hdf5文件的lockfile,但实际上我们只是做一个read操作,按道理来说并不会因为造成多个进程同时读一个文件导致出现bug的情况。而换成单个process运行后恢复正常。

OSError: Unable to open file (unable to lock file, errno = 11, error message = 'Resource temporarily unavailable')

于是我的第一个解决办法是写了一个脚本同时执行多个文件来完成并行,发现程序可以正常运行。但是这样并不方便快捷,于是在google上搜索半天,发现只要增加一行代码就可以解决这个问题,这行代码设置一定要获取hdf5文件的file lock为false。这样之后多进程并行时就不会报错了。

import os
os.environ["HDF5_USE_FILE_LOCKING"] = "FALSE"

这样处理也有个问题,就是如果一边读一边另一个文件正在写入等操作,可能会出现冲突,但是在我当前只需要读取的情况下已经是够用了。欢迎大佬解析这个bug出现的真正原因,交流一下完美的解决方案。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
您好,针对您的问题,可以尝试使用Python多进程模块multiprocessing,将读取Las文件和使用open3d显示的操作分别放到两个不同的进程中执行。 首先,需要安装open3d库: ``` pip install open3d ``` 然后,可以参考以下代码实现: ```python import multiprocessing import open3d as o3d # 定义一个函数,用于读取Las文件并返回点云数据 def read_las(filename): # 读取Las文件,获取点云数据 # ... return points # 定义一个函数,用于显示点云数据 def show_point_cloud(points): # 创建一个可视化窗口 vis = o3d.visualization.Visualizer() vis.create_window() # 创建一个点云对象,并添加到可视化窗口中 pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(points) vis.add_geometry(pcd) # 设置相机位置,调整视角 # ... # 显示点云数据,直到窗口关闭 vis.run() vis.destroy_window() if __name__ == '__main__': # 创建一个进程池,容量为2 pool = multiprocessing.Pool(processes=2) # 在进程池中提交两个任务 file1 = 'filename1.las' file2 = 'filename2.las' result1 = pool.apply_async(read_las, args=(file1,)) result2 = pool.apply_async(read_las, args=(file2,)) # 获取任务结果,并将点云数据传给下一个进程 points1 = result1.get() points2 = result2.get() pool.apply(show_point_cloud, args=(points1,)) pool.apply(show_point_cloud, args=(points2,)) # 关闭进程池 pool.close() pool.join() ``` 上述代码中,使用了Pythonmultiprocessing.Pool()方法创建进程池,并调用apply_async()方法在进程池中提交读取Las文件的任务。然后,通过apply()方法将点云数据传给显示点云数据的进程,并启动可视化窗口显示点云数据。 希望以上内容能够帮到您,如有需要可继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值