2015-03-18 31 views
3

前提:如何從磁盤加載,進程,然後將數據存儲在一個普通的hdf5與python,pyqt,h5py同時?

我創建了一個主窗口。其中一個下拉菜單中有一個'ProcessData'項目。當它被選中時,我創建一個QProgressDialog。然後,我在主循環中進行了大量處理,並定期更新QProgressDialog中的標籤和百分比。

我的處理過程如下所示:從文件(numpy memmapped數組)中讀取大量數據,執行一些信號處理,將輸出寫入常見的h5py文件。我遍歷可用的輸入文件,所有的輸出都存儲在一個通用的h5py hdf5文件中。整個過程每個輸入文件大約需要兩分鐘,並將一個CPU引腳設置爲100%。

目標:

如何讓這個過程非阻塞,使UI仍然響應?我仍然希望我的處理函數能夠更新QProgressDialog及其關聯的標籤。

我可以擴展它以同時處理多個數據集並保留更新進度條信息的能力嗎?

我可以從多個線程/進程/ etc寫入h5py嗎?我必須在寫操作上實現鎖定嗎?

軟件版本:

我使用Python 3.3+與numpy的/ SciPy的/等。 UI在PyQt4 4.11/Qt 4.8中,儘管我對使用python 3.4(以及asyncio)或PyQt5的解決方案感興趣。

+0

[這個答案](http://stackoverflow.com/a/16633274/832621)顯示瞭如何使用'numpy.memmap'數組來實現這個功能 – 2015-03-19 00:26:52

+0

我已經成功地使用memmap數組加載數據來讀取來自磁盤的數據,然後將其存儲在h5py文件中。問題是關於同時做這個過程。 – 2015-03-19 16:12:57

回答

2

這是一個相當複雜的問題需要解決,這種格式不適合提供所有問題的完整答案。不過,我會試着讓你走上正軌。

我該如何使這個過程非阻塞,以便UI仍然是響應?我仍然希望我的處理函數能夠更新QProgressDialog及其關聯的標籤。

要使其成爲非阻塞,您需要將處理卸載到Python線程或QThread。更好的是,將它卸載到一個子進程中,通過主程序中的線程將進程傳回主程序。

我會離開你去實現(或提出另一個問題)創建子進程或線程。但是,您需要知道只有MainThread才能訪問GUI方法。這意味着你需要發出信號,如果使用的是QThread或使用QApplication.postEvent()從一個Python線程(我裹後者成爲Python 2.7庫here。Python 3的兼容性會一天)

燦我將其擴展爲同時處理多個數據集並保留更新進度條信息的能力?

是的。一個例子是產生許多子進程。每個子進程都可以配置爲將消息發送回主進程中的相關線程,該進程通過上述方法描述的方法將進度信息傳遞給GUI。您如何顯示此進度信息取決於您。

我可以從多個線程/進程/ etc寫入h5py嗎?我必須在寫操作上實現鎖定嗎?

您不應該從多個線程一次寫入hdf5文件。您將需要實現鎖定。我認爲甚至可能讀訪問應該被序列化。

我的一位同事已經爲Python 2.7製作了一些內容(請參閱herehere),歡迎您隨時查閱或分發它。

相關問題