Вопрос PowerShell - Ищем самый быстрый метод для l oop через 500 тыс. Объектов, ищущих совпадение в другом массиве 500 тыс. Объектов - PullRequest
0 голосов
/ 24 января 2020

У меня есть два больших файла .csv, которые я импортировал с помощью командлета import-csv. Я провел много поисков и попыток, и, наконец, я пишу, чтобы попросить помощи, чтобы сделать это проще.

Мне нужно переместиться через первый массив, который будет иметь размер от 80 до 500 тыс. Строк. Каждый объект в этих массивах имеет несколько свойств, и мне нужно найти соответствующую запись во втором массиве того же размера, соответствующего свойству оттуда.

Я импортирую их как [systems.collection. arrayList] и я попытался разместить их как хеш-таблицы. Я даже пытался испортить LINQ, о котором упоминалось в нескольких других постах.

Есть ли шанс, что кто-нибудь сможет дать совет или понять, как сделать это быстрее? Такое ощущение, что я ищу в одном стоге сена совпадение с сеном в другом стеке.

$ImportTime1 = Measure-Command {
    [System.Collections.ArrayList]$fileList1 = Import-csv file1.csv
    [System.Collections.ArrayList]$fileSorted1 = ($fileList1 | Sort-Object -property 'Property1' -Unique -Descending)
    Remove-Variable fileList1
}

$ImportTime2 = Measure-Command {
    [System.Collections.ArrayList]$fileList2 = Import-csv file2.csv
    [System.Collections.ArrayList]$fileSorted2 = ($fileList2 | Sort-Object -property 'Property1' -Unique -Descending)
    Remove-Variable fileList2
}

$fileSorted1.foreach({
     $varible1 = $_
     $target = $fileSorted2.where({$_ -eq $variable1})
     ###do some other stuff
})

1 Ответ

0 голосов
/ 24 января 2020

Это может быть полезно: https://powershell.org/forums/topic/comparing-two-multi-dimensional-arrays/

Обновленное решение в комментарии # 27359 + добавить предлагаемое изменение Максом Козловым в комментарии # 27380.

Function RJ-CombinedCompare() {
    [CmdletBinding()]
    PARAM(
        [Parameter(Mandatory=$True)]$List1,
        [Parameter(Mandatory=$True)]$L1Match,
        [Parameter(Mandatory=$True)]$List2,
        [Parameter(Mandatory=$True)]$L2Match
    )
    $hash = @{}
    foreach ($data in $List1) {$hash[$data.$L1Match] += ,[pscustomobject]@{Owner=1;Value=$($data)}}
    foreach ($data in $List2) {$hash[$data.$L2Match] += ,[pscustomobject]@{Owner=2;Value=$($data)}}
    foreach ($kv in $hash.GetEnumerator()) {
        $m1, $m2 = $kv.Value.where({$_.Owner -eq 1}, 'Split')
        [PSCustomObject]@{
            MatchValue = $kv.Key
            L1Matches = $m1.Count
            L2Matches = $m2.Count
            L1MatchObject = $L1Match
            L2MatchObject = $L2Match
            List1 = $m1.Value
            List2 = $m2.Value
        }
    }
}

$fileList1 = Import-csv file1.csv
$fileList2 = Import-csv file2.csv

$newList = RJ-CombinedCompare -List1 $fileList1 -L1Match $(yourcolumnhere) -List2 $fileList2 -L2Match $(yourothercolumnhere)

foreach ($item in $newList) {
    # your logic here
}

Передача списков в эту хеш-таблицу должна выполняться быстро, а также быстро выполнять итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...