加速通过Import-CSV

时间:2015-11-12 17:20:45

标签: performance csv powershell

简单的问题,但是问题很严重。

我有两个从Excel导出的CSV文件,一个有65k行,一个有大约50k。我需要根据这个条件合并这两个文件中的数据: 其中File1.Username -eq File2.Username

请注意,两个文件中username属性的数据类型为:

IsPublic IsSerial Name                                     BaseType                                                                                                          
-------- -------- ----                                     --------                                                                                                          
True     True     String                                   System.Object

显然,循环通过65k x 50k对象属性进行比较需要..井,1天和23小时,因为我估计当我测量的脚本只运行10行时。

此时我正在考虑几种解决方案,例如拆分CSV文件并同时在不同的PowerShell会话中运行不同的部分,同时为powershell.exe提供实时优先级,但这很麻烦,而且我没有测试过该选项,所以我可以不报告表现的实际收益。

我想知道我是否应该更改数据类型,并使用例如.ToString.GetHashCode()但我也尝试了这个选项,奇怪的是,当比较字符串VS字符串比哈希和整数VS哈希和整数时执行时间更快

长话短说,我正在寻找一种比较65k x 50k字符串变量的超快方法。

非常感谢任何帮助:)

谢谢!

阐述示例: 好的,这是一个隐喻的例子。假设你有一个包含宇航员名字和设备的数据库(SPACE),另一个包含宇航员的名字和设备 海洋探险家(海洋)。 因此,在SPACE数据集中,例如:

First Name,Last name, Username, space gear,environment.

然后第一行数据就像:

Neil,Armstrong,Stretch,spacesuit,moon

在OCEAN数据集中,你有:

First Name,Last name, Username, birthdate, diving gear,environment

包含以下数据:

Jacques,Cousteau,Jyc,1910-06-11,diving suit,ocean

现在假设Neil Armstrong在某个时候注册了潜水课程,并添加了OCEAN数据集。 在OCEAN数据集中,您现在拥有:

First Name,Last name, Username, birthdate, diving gear,environment

包含以下数据:

Jacques,Cousteau,Jyc,1910-06-11,diving suit,ocean
Neil,Armstrong,Stretch,1930-08-05,diving suit,ocean

将数据交给我的人给了我第三个数据集,这是另一个数据集的“混合”: 在MIXED数据集中,您现在拥有:

Dataset,First Name,Last name, Username, birthdate, diving gear, space gear,environment

包含以下数据:

ocean,Jacques,Cousteau,Jyc,1910-06-11,diving suit,,ocean
space,Neil,Armstrong,Stretch,1930-08-05,,space suit,moon
ocean,Neil,Armstrong,Stretch,1930-08-05,diving suit,,ocean

所以我的任务是使数据集MIXED看起来像这样:

First Name,Last name, Username, birthdate, diving gear, space gear,environment
Jacques,Cousteau,Jyc,1910-06-11,diving suit,,ocean
Neil,Armstrong,Stretch,1930-08-05,diving suit,space suit,(moon,ocean)

最重要的是,有一些可能发生的非常愚蠢的情况: 1)同一个人可以在SPACE数据集或OCEAN数据集中不止一次,但具有不同的用户名。 2)两个完全不同的用户可以在SPACE数据集中共享相同的用户名,但不在OCEAN数据集中。用户名称是唯一的。是的,你读得正确,库斯托和阿姆斯特朗都可能拥有相同的用户名。

我确实已经考虑过让我的牙齿卡在那个任务之前清理数据的可能性,但这是不可能的。 我必须采用上下文,不能改变任何东西。

所以我做的第一件事是分离用户名字段的记录数,Group-Object -Property Username,我的工作重点是两个数据集中给定用户的情况,如Neil Armstrong。

如果只有一张唱片,就像库斯托一样,它是直截了当的,我保持原样。当每个数据集中有一条记录我需要合并数据时,当一个用户名有超过2条记录时,可以说这是一个完全混乱,虽然我不介意将它们留在现在(特别是因为成千上万的记录有一个[string] :: IsNullOrEmpty($ Username)= $ true所以它们被算作一个大于2个记录的数字。)

我希望它更有意义吗?

目前我想关注一个给定用户名在SPACE和OCEAN数据集中出现一次的情况,我知道它并不复杂,但我使用的算法使得整个过程非常缓慢:

0 - 创建一个空数组 1 - 从SPACE数据集中获取行 2 - 从OCEAN数据集中获取行 3 - 创建一个哈希表,其中包含属性不为空的两个数据集的属性 4 - 创建一个psobject来封装哈希表 5 - 将该对象添加到数组

这需要很长时间,因为我在谈论SPACE中的65k记录和OCEAN中的大约5万条记录。

所以我想知道是否有更好的方法吗?

谢谢!

0 个答案:

没有答案