我正在使用不同的方法执行几个测试,以清理一个大的csv文件,然后将其导入R。
这一次,我在Windows中使用Powershell。
虽然与使用cut()和pipe()相比,它工作得更好,也更准确,但这个过程慢得可怕。
这是我的命令:
shell(shell = "powershell",
"Import-Csv In.csv |
select-object col1, col2, etc |
Export-csv new.csv")下面是system.time()的结果:
user system elapsed
0.61 0.42 1568.51 我看过其他一些通过流媒体使用C#的帖子,只需要几十秒,但我不知道C#。
我的问题是,如何改进PowerShell命令以使其更快?
谢谢,
迭戈
发布于 2014-06-01 05:24:53
在读取csv、将行转换为powershell对象以及转换回csv时,有大量的开销。通过管道这样做也会导致它一次只做一条记录。如果您切换到使用带有-ReadCount参数的Get-Content,并在-replace运算符中使用正则表达式提取数据,则应该能够大大加快速度,例如:
shell(shell = "powershell",
"Get-Content In.csv -ReadCount 1000 |
foreach { $_ -replace '^(.+?,.+?),','$1' |
Add-Content new.csv")这将减少磁盘读取的数量,并且-replace将充当数组操作符,一次处理1000条记录。
发布于 2014-06-02 18:29:06
首先也是最重要的,我的第一个测试是错误的,因为我之前有一些错误,powershell的其他几个会话仍然开放,并延迟了整个过程。
以下是真实的数字:
> system.time(shell(shell = "powershell", psh.comm))
user system elapsed
0.09 0.05 824.53 现在,正如我所说的,我找不到一个好的模式来拆分csv文件的列。
我可能需要补充一点,它是一个杂乱的文件,包含逗号、多行字段、摘要行等字段。
我尝试了其他方法,比如在堆栈溢出中非常著名的一种方法,它使用PowerShell中的嵌入式C#代码来拆分csv文件。
虽然它比我之前展示的更常见的方法更快,但对于这些类型的混乱文件,结果并不准确。
> system.time(shell(shell = "powershell", psh.comm))
user system elapsed
0.01 0.00 212.96 这两种方法显示出相似的RAM消耗(~40Mb)和CPU使用率(~50%)。
因此,虽然前一种方法花费的时间是后一种方法的4倍,但结果的准确性,低成本的资源,以及更少的开发时间,使我认为对于大而杂乱的csv文件,它是最有效的。
https://stackoverflow.com/questions/23974358
复制相似问题