2012-03-12 63 views
0

我必須從電路板讀取數據,以非常高的速度生成數據。我必須快速讀取這些數據,解析並寫入另一個文件。由於讀取操作的速度非常快,我必須在C++中實現兩個線程。這樣一個線程可以讀取數據,另一個線程可以將數據寫入文件。由於讀取和寫入緩衝區相同,所以不能使用鎖定機制。使用環形緩衝區來實現並不是一個好的解決方案。任何其他想法在C++中實現它不會降低讀取速度?如何在C++中以非常高的速度讀取和寫入數據?

+1

當你寫入另一個文件時,讀寫緩衝區是否相同? – UmNyobe 2012-03-12 12:06:20

+0

你說什麼樣的速度?要小心,磁盤速度很慢,除非你有像SSD,RAID等特殊硬件......並且請提及你的操作系統。 – 2012-03-12 12:07:57

+0

板卡生成10mbps的數據。我的操作系統是Windows – indira 2012-03-12 12:18:17

回答

0

首先不要使用文件,如果要獲得良好的性能,請在RAM中處理這些文件。第二,如果你提供更多的信息會有幫助 - 你讀的是什麼?

+0

其實我必須讀取數據並顯示數據爲圖像 – indira 2012-03-12 12:21:27

+0

如果你必須顯示數據,你不寫數據到一個文件...你只要一幀完成就發送給顯示器...... – UmNyobe 2012-03-12 12:27:46

+0

但在解析時,可能會阻止讀取 – indira 2012-03-12 12:32:27

1

映射兩個文件在內存中。使用大小等於頁面大小倍數的較大的讀取和寫入緩衝區。在新文件中使用異步內存寫入。啓動兩個線程,一個讀取,另一個寫入。在兩個線程之間建立通信消息,以便在讀取新文件部分時,將其可用性傳遞給第二個線程。同時,你在第二個緩衝區中讀取文件的新部分,解析和寫入線程可能與其緩衝區一起工作。完成此分析和寫入操作後,將其傳遞給第一個線程以便重新使用此緩衝區。

+0

與乒乓緩衝區是否相同? – indira 2012-03-12 12:36:03

+0

這取決於解析速度。如果速度夠快,可以使用純乒乓緩衝區。如果不是,則使用第二個讀取緩衝區,並從一個讀取緩衝區切換到第二個讀取緩衝區。整個實際的處理速度是解析和寫入速度。所以,試着改進它。即使你可以使用多個解析線程。 – 2012-03-12 13:19:36

1

通常最好讓操作系統處理所有的優化。因此,我會使用某種mmap工具 - Linux/Unix上的mmap(2)系統調用或Win32上的MemoryMapOfFile。

這樣做會指示操作系統使用常規虛擬內存子系統將文件視爲內存位置。這意味着系統以全球最佳方式管理緩衝,並且通常被認爲是最佳的。

這是一個很好的深思:

https://www.varnish-cache.org/trac/wiki/ArchitectNotes

0

我會建議使用condition variable信號作家有準備他的緩衝區。將緩衝區的引用放入隊列也很方便,因此作者可以處理多個緩衝區。
注意,如果數據的處理速度超過了它的處理速度,那麼在某些時候會出現擁塞。

相關問題