2013-02-08 37 views
0

我在遠程位置有大約30萬個圖像文件。我下載(必須)並將這些文件的詳細信息寫入文本文件(附加一些信息)。由於我得到的信息的性質,我必須處理每個文件,因爲它們到達(我也寫每個文件信息到文件行)以獲得某種形式的統計信息,例如,我有一個對象列表的屬性大小和數量,看看我有多少特定尺寸的圖像。從c中的文件計算統計信息的最佳方法#

我也想過讀取和寫入文件,而不保留任何統計信息,我可以再次打開文件添加統計信息。但我想不出一種方法來處理統計信息的250k行多屬性文件。

我知道列表(是的,我有他們2)和每個項目的恆定循環是竊聽應用程序,但有沒有另一種方式?現在已經過了2個小時,應用程序仍然在26K。對於每個圖像項目,我都會這樣做,以便在檢查圖像是否具有之前確定的尺寸的情況下進行計數,並將其添加到該List項目中。

public void AddSizeTokens(Token token) 
{ 
    int index = tokenList.FindIndex(item => item.size== token.size); 
    if (index >= 0) 
    tokenList[index].count+=1; 
    else 
    tokenList.Add(token); 
} 

什麼從文件一行寫到貌似

Hits Size  Downloads  Local Loc     Virtual ID 
204  88.3  4212  .../someImage.jpg  f-dd-edb2-4a64-b42 

我下載的文件如下圖所示;

try 
{ 
    using (WebClient client = new WebClient()) 
    { 
    if (File.Exists(filePath + "/" + fileName + "." + ext)) 
    { 
     return "File Exists: " + filePath + "/" + fileName + "." + ext; 
    } 
    client.DownloadFile(virtualPath, filePath + "/" + fileName + "." + ext); 
    return "Downloaded: " + filePath + "/" + fileName + "." + ext; 
    } 
} 
catch (Exception e) { 
     return"Problem Downloading " + fileName + ": " + e.Message; 
} 
+0

你爲什麼要下載該文件?你需要它的內容嗎?你可以在不下載的情況下獲得它的大小。也許創建一個小的SQL數據庫是一個選項? – VladL

+0

請記住,由於您下載圖像文件,您的瓶頸可能是您的連接速度。如果我們的平均文件大小爲200KB(對於image imho不那麼重要),則您以〜722KB/s的速率下載了5078,125MB的文件,並在大約2小時內提及了26k文件。如果這是一個家庭連接,我認爲這是一個相當可觀的速度,特別是如果你爲每個圖像創建一個單獨的連接。 – Destrictor

+0

圖像大約150KB,我必須下載它們,這是確定的,因爲尺寸不是唯一的問題。我添加了下載方法。 – mechanicum

回答

0

嗯,我想也許編碼是問題。有些問題確實如此。按照Daniel Hilgarth的指示,改爲字典有很大幫助,但只有前30分鐘。然後每分鐘都會變得越來越糟糕。

問題顯然是我提供信息的無辜的UI元素。他們吃掉了太多的cpu,最終導致應用程序死亡。最大限度地減少UI信息饋送(每分鐘1.5k到最低1.3k)。難以置信的!希望它可以幫助其他有類似問題的人。

0

你應該從List<Token>改變你tokenListDictionary<long, Token>
關鍵是大小。

您的代碼應該是這樣的:

Dictionary<long, Token> tokens = new Dictionary<long, Token>(); 

public void AddSizeTokens(Token token) 
{ 
    Token existingToken; 
    if(!tokens.TryGetValue(token.size, out existingToken)) 
     tokens.Add(token.size, token); 
    else 
     existingToken.count += 1; 
} 

這將它從O(n)的操作到O(1)操作改變。

另一點需要考慮的是籬笆的評論。您的互聯網連接速度很可能是這裏的瓶頸。

+0

我現在試試看吧 – mechanicum

+0

由於目前的內存使用情況,它看起來更漂亮。在3分鐘內處理2k個文件。讓我們看看發生了什麼。 – mechanicum

+0

@mechanicum:我的回答中提出的更改不應該對應用程序的內存消耗產生任何影響。 –