如何从磁盘加载、处理,然后在一个通用的hdf5中与python、pyqt、h5py并发存储数据?

2024-09-28 04:23:57 发布

您现在位置:Python中文网/ 问答频道 /正文

前提:

我创建了一个主窗口。其中一个下拉菜单有一个“ProcessData”项。当它被选中时,我会创建一个QProgressDialog。然后我在主循环中进行大量处理,并定期更新QProgressDialog中的标签和百分比。在

我的处理方式如下:从一个文件(numpymemmapped array)读取大量数据,进行一些信号处理,将输出写入一个普通的h5py文件。我迭代可用的输入文件,所有输出都存储在一个通用的h5pyhdf5文件中。整个过程大约需要两分钟,每个输入文件和引脚一个CPU到100%。在

目标:

如何使这个过程不阻塞,以便UI仍然响应?我仍然希望我的处理函数能够更新QProgressDialog及其相关的标签。在

我可以扩展这个功能来同时处理多个数据集,并保留更新progressbar信息的能力吗?在

我可以从多个线程/进程等写入h5py吗。?我必须对写操作执行锁定吗?在

软件版本:

我将python3.3+与numpy/scipy/etc一起使用,UI位于PyQt4 4.11/qt4.8中,不过我对使用python3.4(因此也是asyncio)或PyQt5的解决方案感兴趣。在


Tags: 文件数据ui过程方式标签array百分比
1条回答
网友
1楼 · 发布于 2024-09-28 04:23:57

这是一个非常复杂的问题需要解决,而且这种格式并不适合为所有问题提供完整的答案。不过,我会尽力让你走上正轨。在

How do I make this process non-blocking, so that the UI is still responsive? I'd still like my processing function to be able to update the QProgressDialog and it's associated label.

要使其不阻塞,需要将处理卸载到Python线程或QThread。更好的是,将它卸载到一个子进程中,通过主程序中的一个线程将进度反馈给主程序。在

我将让您实现(或提出另一个问题)创建子流程或线程。但是,您需要知道只有主线程才能访问GUI方法。这意味着如果使用QThread或使用来自python线程的QApplication.postEvent(),则需要发出一个信号(我已经将后者打包到python2.7here的库中)。Python3兼容性总有一天会到来)

Can I extend this to process more than one dataset concurrently and retain the ability to update the progressbar info?

是的。一个例子是生成许多子流程。每个子进程都可以配置为向主进程中的关联线程发送消息,主进程通过为上述点描述的方法将进度信息传递给GUI。如何显示这些进度信息取决于您自己。在

Can I write into h5py from more than one thread/process/etc.? Will I have to implement locking on the write operation?

不应该一次从多个线程写入hdf5文件。你需要实现锁定。我认为甚至连读访问都应该连载。在

我的一位同事已经为Python2.7编写了一些东西(请参见here和{a3}),如果您愿意,欢迎您查看它或分叉它。在

相关问题 更多 >

    热门问题