簡體   English   中英

什么是解析大型數據文件最快的文件/方式?

[英]What is the fastest file / way to parse a large data file?

所以我正在做一個GAE項目。 我需要查找城市,國家名稱和國家代碼以進行注冊,LBS等...

現在,我發現將所有信息放入數據存儲區是非常愚蠢的,因為它將被頻繁使用,並且它會無緣無故地吞噬我的數據存儲區報價,特別是這些列表將發生變化,因此將其毫無意義地放入數據存儲區。

現在剩下一些選擇:

API-付費服務沒有預算,免費服務並不完全可靠。

上傳可解析的文件-有利的選項,因為我喜歡確定數據將始終存在的可能性。 因此,我從GeoNames獲得了所需的文件(鏈接包含所有國家/地區的源文件,以防有人需要)。 每個國家/地區的文件都是標准的UTF-8制表符分隔文件,非常好。

但是,既然我現在可以選擇如何格式化和訪問數據,那么問題是:

從Javaservelet容器中的靜態文件系統地格式化和檢索數據的最佳方法是什么?

最好的方法是最快,最省資源的方法。

有效選項:

  1. TXT文件,制表符分隔
  2. XML文件靜態
  3. 帶有大量枚舉的Java類

我知道將國家文件作為Java枚舉導入並通過它們的值將非常快,但是您是否認為這會超出合理的范圍影響內存? 另一方面,每次我需要訪問一條記錄時,循環將遍歷幾千行,直到找到所需的記錄為止……逐行讀取,因此沒有內存問題,但是速度非常慢……有一些在Java servelet中解析excel文件的經驗,花了大約20秒鍾才能解析250條記錄,大規模的響應時間會超時(毫無疑問),XML就像excel一樣嗎?

非常感謝你們 !! 請提供意見,所有一切都值得贊賞!

最簡單,最快的方法是將文件作為靜態Web資源文件保存在WEB-INF文件夾下,並在應用程序啟動時使用上下文偵聽器將文件加載到內存中。

在內存中,它應該是Map ,它是您要搜索的鍵的映射。 這樣您將獲得恆定的訪問時間。

內存消耗只有在確實很大的情況下才重要。 例如,如果需要多次訪問,那么十萬條記錄就不值得優化。

靜態文件應為純文本格式或CSV,它們的讀取和解析效率最高。 不需要XML格式,因為解析起來會很慢。

如果列表確實很大,則可以將其分解為多個較小的文件,並且僅在需要時才解析它們。 一個合理,簡單的分區將是按國家/地區對其進行划分,但其他任何分區都可以使用(例如,根據其名稱,使用其名稱中的前幾個字符)。

您也可以考慮一次在內存中構建此Map ,然后將此映射序列化為二進制文件,並將該二進制文件作為靜態資源文件包括在內,這樣,您只需反序列化此Map ,就無需將其解析/處理為文本文件並自己構建對象。

數據文件的改進

將靜態資源文件作為文本/ CSV文件或序列化的Map數據文件的替代方法是,將其作為二進制數據文件,您可以在其中創建自己的自定義文件格式。

使用DataOutputStream ,可以以非常緊湊和高效的方式將數據寫入二進制文件。 然后,您可以使用DataInputStream從此自定義文件加載數據。

該解決方案的優點是文件可能更少(與純文本/ CSV /序列化的Map相比),並且加載速度更快(因為DataInputStream不使用文本中的數字解析,例如,它讀取字節)的數字直接)。

將數據保留為XML的源形式。 一天開始時或更改時,將其讀入內存:這是您唯一的解析費用。 然后有兩個主要選項:

(a)您的內存中表單仍然是XML樹,並且您使用XPath / XQuery對其進行查詢。

(b)您的內存形式類似於Java HashMap

如果數據非常簡單,則(b)可能是最好的,但它只允許您執行一種硬編碼的查詢。 如果數據更復雜或您有各種可能的查詢,則(a)會更靈活。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM