我正在尝试导入一个包含700多万条记录的~2.5 GiB .csv文件。
----- 2021-09-13 06:28 2745868408 thefile.txt
3个多小时后,我停止了下面的命令。任务管理器报告内存利用率接近100%,所有内核的CPU利用率约为90%。
$x = Import-Csv -Path '.thefile.txt' -Delimiter '|'
Import-Csv
是否有已知的极限?必须使用Get-Content|ForEach-Object
吗?
PS C:> $PSVersionTable.PSVersion.ToString()
7.1.4
您可以在管道中使用它,而不是将整个输出分配给一个变量。
然而…
PowerShell,或一般的脚本,是为了使日常任务尽可能简单。这就是为什么性能或内存消耗等因素的优先级低于其他考虑因素,如简单性和可用性。
如果您面临一个非常高负载和性能密集型的任务,脚本工具往往不再是理想的选择。
原生PowerShell对于你每天1kb的csv文件来说很好,但是对于这种情况,你可能应该考虑使用第三方库。当然,你仍然可以在PowerShell中使用它。毕竟它是。net,这就是为什么它是一个如此伟大的工具。评论中提到了一些不错的。net Csv解析器。
如前所述,我不认为cmlet有任何硬编码限制。限制只在于您的硬件和一个简单的事实,即cmdlet不是为高性能地处理大文件而设计的,而是为了在日常情况下易于使用。完全同意@marsze
只是一个你可以做的测试:如果你只是想在.csv文件中寻找具体的记录,你应该避免尝试将它加载到内存中,而是将它管道到一个过滤器中。我不使用import-csv这个方法,但是使用get-content,它允许我在2Gb的日志文件中找到具有正确性能的特定记录。