簡體   English   中英

C#-排序File.ReadLines IEnumerable而沒有內存開銷?

[英]C# - Sort File.ReadLines IEnumerable without Memory Overhead?

這可能嗎?

我有以下代碼來減少內存使用總量:

File.WriteAllLines(
    Path.Combine(Path.GetDirectoryName(file[0]), "(Sort A-Z) " + Path.GetFileName(file[0])),
    File.ReadLines(file[0]).OrderBy(s=>s)
);

(file [0]是輸入文件路徑)。

這減少了ForEach等的使用,從而減少了CPU使用率以及內存使用率(幾乎沒有)。 它也比使用Foreach更快。 但是,問題是.OrderBy(s => s)導致其將整個內容加載到內存中。 它不像通常將其加載到內存中那樣糟糕,但是它仍然會占用大量內存。 (我使用的是80mb文件)。

保存到文件而不用太多內存時,是否可以通過A-> Z通過IEnumerable / Order進行排序?

我知道這聽起來很模糊,也不確定我在尋找什么,因為我不認識自己。

在270萬行文件中以.OrderBy(s => s)運行:
https://i.imgur.com/rUyDeFJ.gifv

在270萬行文件中運行WITHOUT .OrderBy(s => s):
https://i.imgur.com/Ejbnuty.gifv
(您可以看到它完成了)

.OrderBy必須將整個內容加載到內存中。 它不可能以任何其他方式工作。

OrderBy接收IEnumerable。 因此,它一次接收項目。 但是,請考慮以下情況:最后一行需要在第一行之前進行排序。 僅當最后一行和第一行都同時在內存中時才能實現。 考慮整個輸入已經按相反順序排序的情況。 希望這些例子能說明為什么OrderBy必須將整個內容加載到內存中。

存在將數據集划分為磁盤上各個分區,然后合並這些分區的算法。 但是,它們超出了Linq OrderBy函數的范圍。

在內部,OrderBy將所有內容讀取到緩沖區數組中,然后對其進行快速排序。 如果您覺得自己很勇敢,請參考參考源: https ://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,2530(分散在整個文件中,但第2534-2542行最好說明一下)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM