2012-06-04 98 views
2

如果我有一個CSV文件,將文件保存爲放置文本還是將其轉換爲其他格式會更快? (用於搜索)CSV文件,二進制格式更快?最快的搜索?

在搜索CSV文件方面,檢索特定行(按鍵)的最快方法是什麼?不提到排序文件抱歉,我的意思是查找文件中的任意鍵。

有些更新:

  1. 文件將被只讀
  2. 文件可以被讀取並保存在內存中
+1

您的CSV文件有多大? –

+0

@HunterMcMillen說100萬行,我編輯了這個問題,尋找沒有排序的查找算法。 – loyalflow

回答

1

如果你有太多的數據,是非常的生產水平,然後使用Apache Lucene

如果它的小數據集或其關於學習,然後通過Suffix treeTries

2

有幾件事情要考慮這一點:

  • 你存儲什麼樣的數據?它是否有意義,將其轉換爲二進制格式?二進制格式會佔用較少的空間(讀取文件所花費的時間取決於大小)?

  • 在系統運行時,您是否對同一文件有多個查詢?或者每次有人執行查詢時您是否必須加載文件?

  • 您是否需要在不同系統之間高效地傳輸文件?

所有這些因素對決策都非常重要。常見的情況是您只需要加載一次文件,然後執行很多查詢。在這種情況下,數據存儲的格式並不重要,因爲無論如何它都會存儲在內存中。花更多時間思考良好的數據結構來處理查詢。

另一種常見情況是,您無法保持主應用程序正在運行,因此無法將該文件保留在內存中。在這種情況下,擺脫文件並使用數據庫。您可以使用的任何數據庫將比您能想到的任何數據都快。但是,在系統之間傳輸數據庫並不容易。

儘管很可能,文件格式並不是真正需要考慮的問題。我已經閱讀了很多非常長的CSV文件,與之後我需要處理的數據相比,讀取文件所花的時間通常可以忽略不計。

+0

該文件將是隻讀文件,沒有突變。 – loyalflow

+0

+1決定前的所有注意事項。即使這看起來更像一個Programmers.SE的答案。 –

+0

@ user1361315:如果您可以將文件保存在內存中,則完全不關心格式。將文件解析爲針對您的查詢類型優化的數據結構並使用該數據結構。分析您所期望的類型查詢並實現數據結構將有足夠的工作量,因此花了您的時間在此優化。您的問題使您看起來像計劃將文件保存在內存中,就像字節流一樣(即不解析它)。這將是一個非常愚蠢的想法,因爲解析會讓你的生活更輕鬆。無論文件格式如何,解析後的內存結構都是一樣的。 – LiKao

1

將它轉換(即將其導入)到可搜索列上的索引和具有最高基數的列上的主鍵的數據庫表(或最好是標準化表) - 無需重新發明輪子...你會爲自己節省很多問題 - 事務管理,併發......真的 - 如果它將在生產中,你希望保持它的csv格式的機會很少到零。

+0

我正在尋找我的問題的答案,而不是一個替代解決方案:) – loyalflow

+1

它將其轉換成數據庫更快。那回答你的問題:) – Nathan

0

如果文件太大而不能保存在內存中,那麼只需將這些鍵保存在內存中。一些行數也可以保存在內存中,最近訪問的行被分頁出去,因爲需要額外的行。使用fseeks(通過鍵指示)和文件來查找文件本身中的行。然後將該行加載到內存中,以防需要該行上的其他條目。