2012-04-09 21 views
1

我有200萬個文件分佈在分爲幾年和幾個月的子文件夾中。 我使用遍歷文件:EnumerateFiles在子文件夾上的內存效率

foreach (string file in Directory.EnumerateFiles(data_path, "*.*", SearchOption.AllDirectories)) 

,我應該想到的是分區所列舉用嵌套的結構設置:

foreach (string year_folder in Directory.EnumerateDirectories(data_path)) 
    foreach (string month_folder in Directory.EnumerateDirectories(year_folder)) 
     foreach (string file in Directory.EnumerateFiles(month_folder)) 

會更內存使用效率?

請參閱下面我的評論。

+0

我真的很想聽聽這個結果,如果你發現一個更有效的方式來做這個生病的話,將它添加到我的流利的System.IO包裝 – 2012-04-09 01:23:16

+1

你應該嘗試並找出;你有兩種情況下編寫的代碼,所以只需分析每個代碼的運行情況,你就會知道。即使其他人推理哪一個更好,理論上相當困難。這種差異很可能是如此之小以至於不被重大關注。 – Servy 2012-04-09 01:58:49

+0

我想知道的是,IEnumerable集是否佔用內存,直到循環迭代最後一個元素(證明第二種方法),或者在循環中是否更頻繁地完成垃圾回收(然後這兩種方法相似) – eyaler 2012-04-10 08:46:53

回答

1

你的是略小

你提出的解決方案將是稍微更多的內存使用效率,哪怕只是因爲你可以硬編碼的事實,有整整三個嵌套級別,前兩個是目錄只有最後一個只包含文件。

他們稍微一般

在另一方面,Directory.EnumerateFiles()必須實現與任意目錄嵌套(這將涉及保持的地方是在跟蹤它自己的內部堆棧一般情況下的解決方案枚舉)。

無論是一個人的精,這裏是權衡

你實現你的綁定代碼添加到您當前,特定的目錄結構。我有點能夠瀏覽你的foreach循環,並可視化文件夾結構是它期望在磁盤上找到的。

另一方面,如果您或您的團隊中的某個人想要更改目錄佈局,那將是一個麻煩。如果它不是很可能改變它或者簡單到足以更新你的代碼,如果你改變你的目錄結構,似乎可以安全地使用你的方法。