我正在处理一些数GB大小的文本文件,想用 PowerShell 进行流式处理。它是简单的内容,只需解析每一行并提取一些数据,然后将其存储到数据库中。
不幸的是,在管道的这个阶段,get-content | %{ whatever($_) }
似乎会将整个行集保留在内存中。这也非常慢,需要很长时间才能真正读入所有内容。
我的问题有两个部分:
- 如何逐行流式处理而不将整个内容缓冲在内存中?我不想为此目的使用几GB的RAM。
- 如何让它运行更快?PowerShell 迭代
get-content
似乎比C#脚本慢100倍。
我希望这里有些愚蠢的地方,例如错过了 -LineBufferSize
参数之类的东西...
get-content
的速度,将-ReadCount设置为512。请注意,在这个时候,在Foreach中的$_将是一个字符串数组。 - Keith HillGet-Content
的结果分配给一个变量,因为这会将整个文件加载到内存中。默认情况下,在管道中,Get-Content
一次处理一个文件行。只要你不积累结果或使用一个内部累积的 cmdlet(如 Sort-Object 和 Group-Object),那么内存占用就不会太大。使用 Foreach-Object(%)是一种安全的方法,可以逐行处理每一行。 - Keith Hillget-content |%-Process {whatever($ _)}
,如果您希望它在每行输入时执行。 - dwarfsoftget-content | % -End { }
,则会发现它会抱怨因为您没有提供处理块。因此,它不能默认使用-End,必须默认使用-Process。请尝试使用1..5 | % -process { } -end { 'q' }
,并查看结束块只发生一次,通常的gc | % { $_ }
如果脚本块默认为-End,则不起作用... - TessellatingHeckler