2013-05-17 87 views
-1

從性能的角度來看,從XML文件讀取大量數據或循環訪問數組會更有益處?我有約2000個數據集我需要循環和做計算,所以我只是想知道是否會更好地導入所有的XML數據和處理它作爲一個數組(單個大型導入)或導入每個數據集順序(很多小的進口)。XML與陣列性能

想法和建議?

+0

「XML vs Array」實際上並不是你要求的。我建議你改變你的頭銜。 –

+2

你的測試說什麼? – I4V

+0

@ l4v - 我還沒有測試過它,它需要修改一些代碼,只是想在這一點上收集一些輸入 – mikedugan

回答

1

如果我正確解釋了你的問題,你需要從一個文件中加載2,000組數據,然後處理它們。所以你必須讀取所有的數據並處理所有的數據。在基礎層面上,有相同數量的工作要做。

所以我認爲這個問題是「我怎麼能早些完成相同的處理?」

考慮:

數據使用多少內存?如果內存容量超過1.5GB,則無法在32位個人電腦上一次處理,即使在64位電腦上,您也可能會看到虛擬內存分頁查殺的性能。無論在哪種情況下,以較小的數據塊流式傳輸數據都是必需的。相反,如果數據很小(例如,我所知道的2000條記錄可能只有200kB),那麼您可以通過在一個塊中讀取來獲得更好的I/O性能,或者與處理相比,它會加載得太快時間沒有試圖優化它。

記錄是否獨立? (所以他們不需要按特定的順序處理,並且你不需要在內存中存在一條記錄來處理另一條記錄)如果是這樣,並且如果加載時間總體上顯着,則「最佳」方法可能是爲了平行操作 - 如果您可以在後臺加載更多數據的同時處理某些數據,則可以更好地利用硬件,並在更短的時間內完成相同的工作。所以你可能想考慮將你的加載和處理分解到不同的線程上。

但是,如果加載時間比處理時間長,則將處理擴散到多個線程可能無助於您,因爲處理線程在等待I/O時可能會餓死數據 - 所以使用1個處理線程可能會和處理線程一樣快使用3或7.並且創建更多的線程比獲得可用的CPU核心沒有意義。如果使用多線程,我會寫它來使用可配置/動態數量的線程,然後進行一些測試以確定最佳方法。

但在考慮所有這些之前,您可能需要考慮編寫一個強力方法並查看性能如何。你甚至需要需要來優化它嗎?

如果答案是「是的,我迫切需要優化它」,那麼你能重新考慮數據格式嗎? XML是一種非常有用但非常低效的格式。如果您遇到性能嚴重的情況,您是否可以做任何事情來縮小XML大小(例如,簡單地使用較短的元素名稱可以在大文件上產生巨大差異),甚至可以使用更緊湊和易讀的二進制格式?

+0

那裏有一些很棒的輸入,謝謝...所以有一個問題...什麼是XML和二進制之間的最佳中間地帶,維護某種程度的人類可讀性(二進制是「可讀的」,但你明白了),同時更好地爲程序使用優化? – mikedugan

+0

如果你想要人類可讀的話,你可以使用xml,但爲了使它更快閱讀,請使用緊湊格式。例如。而不是「custonername」作爲元素標籤,像「cname」,「cust」或「cn」可能是「可讀的」,但更短。 Xml讀取趨勢是相對於數據大小的線性時間,因此文件大小減半通常會導致加載時間變長。 –