将多个大型csv文件与Powershell合并时出现内存错误
对于如何使用Powershell将多个CSV文件合并为一个文件的问题,有一些很好的回答,除了中的第一个文件外,所有文件都会删除标题行。将多个大型csv文件与Powershell合并时出现内存错误,powershell,csv,Powershell,Csv,对于如何使用Powershell将多个CSV文件合并为一个文件的问题,有一些很好的回答,除了中的第一个文件外,所有文件都会删除标题行。 Kemiler2002发布的答案在大多数情况下对我来说都很好,但是当输出文件超过2GB时,我开始出现内存不足异常错误。将抛出以下错误消息 Exception of type 'System.OutOfMemoryException' was thrown. At xxx.ps1:9 char:20 + $false {$lines | Se
Kemiler2002发布的答案在大多数情况下对我来说都很好,但是当输出文件超过2GB时,我开始出现内存不足异常错误。将抛出以下错误消息
Exception of type 'System.OutOfMemoryException' was thrown.
At xxx.ps1:9 char:20
+ $false {$lines | Select -Skip 1}
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:) [], OutOfMemoryException
+ FullyQualifiedErrorId : System.OutOfMemoryException
这是在使用Powershell 5.1。MaxMemoryPerShellMB(报告为2147483647)似乎没有问题,实际系统内存也没有问题-上次我运行此程序时,剩余的可用内存为33GB(总共64GB)
现在脚本继续运行,并添加到文件中(我最后的一个文件大小约为7GB),但当我看到出现此错误时,我无法确定它是否捕获了所有文件中的每一行
有什么建议吗
编辑
我添加了一些输出,以便查看错误发生的位置。我添加了11个文件,大小从350MB到1GB不等。。。是这两个1GB左右的文件导致了错误。一个报告的长度为909050983,另一个报告的长度为973429260。我没有一个大文件来测试这一点,但是使用.net方法可能是一种替代方法,因为您可以一次只处理一行,而不是将整个内容加载到内存中
$filepath = "c:\temp"
$outputfile = "c:\temp\output\result.csv"
$encoding = [System.Text.Encoding]::UTF8
$files = Get-ChildItem -Path $filePath -Filter *.csv
$w = New-Object System.IO.StreamWriter($outputfile, $true, $encoding)
$skiprow = $false
foreach ($file in $files)
{
$r = New-Object System.IO.StreamReader($file.fullname, $encoding)
while (($line = $r.ReadLine()) -ne $null)
{
if (!$skiprow)
{
$w.WriteLine($line)
}
$skiprow = $false
}
$r.Close()
$r.Dispose()
$skiprow = $true
}
$w.close()
$w.Dispose()
有些人用这种方法做这件事简直是疯了
获取内容$SrcFile1,$SrcFile2 |设置内容$DstFile
别那样做!它的速度慢得可笑,并且总是导致内存异常错误。相反,使用来自命令处理器的良好旧文件副本,例如
cmd/c“copy$($SrcFile1)+$($SrcFile2)$($DstFile)”
好吧,最简单的方法是确保您运行的是64位powershell实例,而不是32位实例。是的,对不起,我应该提到它是以64位运行的。我明天会试一试。。。。但我认为这将是非常缓慢的。使用UltraEdit手动编辑标题,然后将文件复制到一起,再添加回标题行,可能更有效。啊!当然,我也可以编写这些手动组件的脚本-将头文件从第一个文件复制到临时文件中,去掉所有文件的头文件,将它们一起复制到临时主体文件中,然后合并临时主体文件和临时主体文件。哇。。。实际上,启动脚本只是为了让它在一夜之间运行,事实证明它比我使用的另一个脚本要高效得多。另一个脚本花了大约40分钟来处理这11个文件,而这里只花了10分钟,您的脚本完成了75%。毫不犹豫地仔细阅读了两个大文件。对不起,我会投票支持你的答案,将其标记为答案,但我没有足够的声誉。我如何在其中设置编码选项?我的源文件中的口音都被弄乱了。我知道有一种方法可以设置StreamWriter的编码,但我不确定如何以您调用它的方式进行设置。