gpt4 book ai didi

powershell - 如何在不耗尽内存的情况下删除 Powershell 中的重复项?

转载 作者:行者123 更新时间:2023-12-04 03:10:23 27 4
gpt4 key购买 nike

我目前在 Windows Powershell 中使用此命令从简单的 1 行 CSV 中删除重复项。

gc combine.csv | sort | get-unique > tags.cs

每当我在 150mb CSV(2000 万行猜测)上运行它时,任务管理器都会显示 Powershell 耗尽所有可用内存(32GB),然后使用虚拟内存。我还让脚本运行了大约一个小时,但它没有完成。我觉得这很奇怪,因为在 excel 中,从我的 1M 行 CSVS 中删除重复项通常需要几秒钟。有关如何处理此问题的任何建议?

最佳答案

你可以试试:

Get-Content combine.csv -ReadCount 1000 | 
foreach-object { $_ } |
Sort-Object -Unique |
Set-Content tags.cs

( gc combine.csv -read 1kb | % { $_ } | sort -uniq | sc tags.cs )

但我认为你会遇到同样的问题。如果您想要更快的结果,并且不需要对它们进行排序,则只需要不重复:
$Lines = [System.Collections.Generic.HashSet[string]]::new()


$Lines.UnionWith([string[]][System.IO.File]::ReadAllLines('c:\path\to\combine.csv'))


[System.IO.File]::WriteAllLines('c:\path\to\tags.cs', $Lines)

在 23 秒内运行我的测试 20M 随机数文件和 ~1.5GB 内存。如果确实需要对它们进行排序,请使用 SortedSet而不是 HashSet ,运行时间为 5 分钟,内存小于 2GB。当您的代码仍在运行并且当前通过 15GB 时。

编辑: tiberriver256 评论 [System.IO.File]::ReadLines而不是 ReadAllLines可以在文件读取完成之前进行流式传输;它返回一个枚举数而不是所有行的最终数组。在 HashSet 的情况下,这会将运行时间从 12.5 秒降低到 11.5 秒 - 它变化太大而无法确定,但它似乎确实有所帮助。

关于powershell - 如何在不耗尽内存的情况下删除 Powershell 中的重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51623850/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com