2017-08-10 47 views
0

我有一個正在處理大型數據集的進程,處理Parallel.ForEach中的記錄,然後將結果存儲在ConcurrentQueue<List<string>>中。因此處理記錄,記錄中的每個字段都會生成一個字符串,然後將其添加到List。在List然後是Enqueued的記錄末尾,並且進一步處理在保存所有處理的記錄的ConcurrentQueue上完成。大型不確定數據集的可伸縮集合

經過幾個小時的處理後,我注意到我的CPU使用率已經從一個新的浪潮中保持很高的水平,並且處理一組記錄的時間開始增加。

我在這裏的假設是List被填充到容量然後複製到一個新的更大List。隨着CPU容量的不斷增大,初始化週期也在不斷增長。我正在使用的數據集大小不確定,因爲每個記錄都有可變數量的子記錄。家長記錄的數量通常在500k左右。

所以我的第一個想法是將List初始化爲父記錄的Count。由於兒童記錄,List仍然必須增長,但它至少必須增長更少的次數。但有沒有其他一些替代List的替代品可以更好地擴展?或者比我的第一個本能更好的方法?

回答

1

ConcurrentQueue實現爲鏈接列表,不需要調整容量大小(與常規隊列不同)。 所以你的問題將在別處。

您可能想查看清理已處理列表時所使用的內存量和垃圾收集率。

其他提示:

  • ,如果有大量的字符串操作,從一個領域構建字符串時,使用StringBuilder(如果你還沒有這樣做)。
  • 如果記錄中有很多字段,並且事先知道了多少種方法:每個記錄使用一個數組而不是一個List,或者將List容量設置爲一個值,該值將容納記錄的所有字符串。
+0

相關知識介紹ConcurrentQueue。我會提示檢查字符串本身(這是我剛纔得到的代碼庫,現在它正在掙扎)。列表上容量的設置絕對是可行的,因爲字段數在記錄中是靜態的。 – bcwiniger

+2

在這種情況下,每個記錄使用一個數組而不是一個列表(稍微快一點) –