2017-01-23 107 views
3

總體目標是儘可能快地搜索和讀取二進制文件。對於給定的有限參數集p_1,p_2,...,p_n,我希望能夠搜索二進制文件並檢索與參數對應的內容。我的一般想法是以某種方式在參數集{p_i}和對應於{p_i}的起始內存位置之間創建(散列?)映射。當然,我還需要知道要讀取多少字節,但是這取決於確定要讀取的對象的{p_i}。代碼將用C++編寫。從二進制文件中檢索內存塊

所以,我想我的問題是:

1什麼是實現搜索二進制文件的目標最快的方法是什麼?

2-我上面的想法是否有意義?如果是的話,它會是最有效的方式嗎?

我很樂意回答任何後續問題。提前致謝!

+0

在讀取每個對象之前使用'fstream :: tellg()'獲取文件位置,並將其放入地圖。 – Barmar

+1

你知道這個問題已經有幾百萬個解決方案。將「數據庫」或「索引」打入您喜愛的搜索引擎。 –

+0

檔案有多大?標準的解決方案是存儲映射文件,然後使用指針算術。 –

回答

1

大數據解決方案是將數據行分爲密鑰和有效負載。考慮使用k,而不是使用字母p來表示鍵。這樣,你可以使用p來獲得有效載荷。

該密鑰包含哈希映射或多重映射(如果存在密鑰副本)。這些密鑰僅在主搜索關鍵字K n上編制索引。

散列圖或散列多圖的值是包含P n的有效載荷文件中的位置。根據您的有效負載數據的稀疏性以及其他相關因素,定位可以是以下任何一種。

  • 甲範圍內開始和結束字節或塊索引
  • 的索引成僅固定長度的記錄
  • 序列化對象的起始字節或塊自我歧義消除在某種程度上其長度

您的預期搜索,插入,刪除和更新操作分佈的詳細信息以及這些操作是否將分別實時或批量完成將決定什麼是最優協議t o用於添加或刪除密鑰及其關聯的有效負載。

當查詢速度是最重要的因素時,整個密鑰K和有效載荷P可以定期重新生成。如果需要幾個9的可用性,您的K和P可能需要雙緩衝,類似於在遊戲顯示適配器中使用多個顯示緩衝區或端口。 (這是因爲設計和處理可靠更新機制的成本可能會超過系統存儲容量翻倍的成本。)

如果密鑰足夠精細以適應內存,密鑰運行速度最快,並且保持簡單。否則(在大查詢中)密鑰需要通過一些關鍵的分割機制分佈在集羣的多個節點的存儲器中。在後一種情況下,有效載荷也可能以對應於密鑰分發的方式分佈在RAID設備上。如果沒有羣集可用,作爲最後的手段,散列映射可以在磁盤上實現。

在搜索中,一旦你確定你的關鍵,K ñ,然後你可以檢索您的數據範圍對於P ñ和構造對象(或在多圖的情況下,對象)從它。

打開用於隨機接入至P有效載荷文件,並調用FSEEK,lseek的,或lseek64,以點P Ñ 。這些低級調用將任何給定P n的適當磁盤扇區的位置委託給操作系統,設備驅動程序,總線驅動程序,磁盤固件和相關硬件。 [1]您可以將模板用於您最喜歡的庫中的關聯容器,也可以使用std命名空間的關聯容器。

[2] Sparcity是您的有效載荷中的字段具有值的程度。 [3]另一個細節是,如果您正在構建一個庫,您可能希望識別空變量長度值,未分配值,未知值或不確定值之間的差異(通過類型或狀態代碼)。

[4]磁盤哈希容器的設計超出了可以在簡單的StackOverflow答案空間中涵蓋的內容。

[5]這些I/O調用的手冊頁以及如何打開文件描述符或流提供瞭如何使用隨機訪問I/O的詳細信息。網上也有很多例子。