在 PowerShell 中处理大型数组

共4个回答, 标签: arrays powershell powershell-jobs

我很难理解在 PowerShell 中处理大型数据集/数组的最有效方法。我有几百万个项目需要处理和分组的数组。这个列表的大小总是不同的,这意味着它可能是 350 万个项目,也可能是 1000 万个项目。

示例: 他们按 “4” 分组的 350 万个项目,如下所示:

项目 0,1,2,3 组在一起 4,5,6,7 组在一起,以此类推。

我试图通过循环列表并分配给 pscustomobject 来使用单个线程处理数组,pscustomobject 只需要 45-50 分钟就能完成。

我还试图将数组分解成较小的数组,但这导致进程运行的时间更长。

$ I = 0
$ _ 数组 = @ ()
$ Item _ 数组 # 大数据集


当 ($ i-lt $ item _ array. length) {

$ O = "测试"
$ Oo = "Test"
$ N = $ item _ 数组 [$ i]; $ i
$ Id = $ item _ 数组 [$ i]; $ i
$ Ir = $ item _ 数组 [$ i]; $ i
$ Cs = $ item _ 数组 [$ i]; $ i

$ 项目 = [PSCustomObject 】 @ {
'Field 1' = $ o
'Field 2' = $ oo
'Field 3' = $ n
'Field 4' = $ id
'Field 5' = $ ir
'Field 6' = $ cs
}
$ _ 数组 = $ 项目

}

我想,如果我应用一个允许我运行多个作业的作业调度程序,将会大大减少处理时间, 但是我想让其他人快速有效地解决这个问题。

第1个答案

如果处理大数据,使用 C # 也很有效。

添加类型类型定义 @"
使用系统.集合.通用;

公共静态类测试
{
公共静态列表转换 (对象 [] src)
{
Var 结果 = 新列表();
对于 (var i = 0; i <= src.Length-4; i = 4)
{
添加 (新的 {
字段 1 = “测试”,
字段 2 = “测试”,
字段 3 = src [i 0],
字段 4 = src [i 1],
字段 5 = src [i 2],
字段 6 = src [i 3]
});
}
返回结果;
}
}
@

$ Item _ 数组 = 10000000
$ 结果 = [测试]:: 转换 ($ item _ 数组)

第2个答案

RokumaruS 版本是无与伦比的,在这里,我尝试从Js2010

一样的$item_array = 1..100000适用于所有版本

>。\ SO_56406847.ps1
测量.BDups
测量.
测量.西奥
测量.js2010
测量.rokumaru
BDups = 75,9949897 总秒
LotPings = 2,3663763 TotalSeconds
Theo = 2,4469917 总计秒
Js2010 = 2,91981 14 总计秒
Rokumaru = 0,0109287 总计秒

# # Q: \ Test \ 2019 \ 06 \ 01 \ so _ 56406847.ps1
$ I = 0
$ Item _ 数组 = 1.100000 # 大型数据集

'Measuring... LotPings'
$ LotPings = 测量-命令 {
$ _ 数组 = for ($ i = 0; $ i-lt $ item _ array. length; $ i = 4) {
【 PSCustomObject 】 @ {
'Field 1' = "Test"
'Field 2' = "Test"
'Field 3' = $ item _ 数组 [$ i]
“Field 4” = $ item _ 数组 [$ i 1]
'Field 5' = $ item _ 数组 [$ i 2]
“Field 6” = $ item _ 数组 [$ i 3]
}
}
# 测量-命令
第3个答案

这是怎么回事?32.5x 更快。用 = 杀死小狗制作数组。它每次都会复制整个数组。

$ I = 0
$ Item _ 数组 = 1.100000 # 大型数据集

“测量……”

# 原始 1 分钟 5 秒
# 矿 2 秒
#其他答案,2 秒或 3 秒
# C # 版本 0.029 秒,2241x 更快!

测量命令 {

$ _ 数组 =
当 ($ i-lt $ item _ array. length) {
$ O = "测试"
$ Oo = "Test"
$ N = $ item _ 数组 [$ i]; $ i
$ Id = $ item _ 数组 [$ i]; $ i
$ Ir = $ item _ 数组 [$ i]; $ i
$ Cs = $ item _ 数组 [$ i]; $ i
# $ 项目 =
【 PSCustomObject 】 @ {
'Field 1' = $ o
'Field 2' = $ oo
'Field 3' = $ n
'Field 4' = $ id
'Field 5' = $ ir
'Field 6' = $ cs
}
# $ _ 数组 = $ items
}

}
第4个答案

你能充分利用这个有点用ArrayList,或者通过使用强类型的名单但是在数组中浏览数百万个元素仍然需要时间..

至于你的代码: 不需要首先捕获变量中的数组项值,然后使用它添加到 PSCustomObject 中。

$ Item _ 数组 = 'a' 、 'b' 、 'c' 、 'd' 、 'e' 、 'f' 、 'g' 、 'h' # 大数据集
$ 结果 = 新对象系统.集合.通用.列表 [PSCustomObject]
# 或使用 ArrayList: $ 因此 = 新对象系统的藏品.ArrayList

$ I = 0
当 ($ i-lt $ item _ array. count) {
[无效] $ 结果。添加 (
【 PSCustomObject 】 @ {
“字段 1” = “测试” # $ o
“Field 2” = “Test” # $ oo
$ Item _ 数组 [$ i] # $ n
“Field 4” = $ item _ 数组 [$ i] # $ id
$ Item _ 数组 [$ i] # $ ir
“Field 6” = $ item _ 数组 [$ i] # $ cs
}
)
}

# 可能保存到 CSV 文件?
$ 结果 | 导出-Csv d: \ blah.csv '-无类型信息

如果您需要结果再次成为 “正常” 数组,请使用$result.ToArray()

相关问题

"注意: 未定义的变量"、"注意: 未定义的索引" 和 "注意: 未定义的偏移量" 使用 PHP 删除数字数组中的所有重复数字 [重复] 使用数组中的键获取最小值 如何在异步和线程中执行大量 sql 查询 在 PowerShell 中处理大型数组 。PowerShell 中的 NET 跟踪,无需创建。配置文件