чистый список адресов электронной почты из хэша MD5 - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь удалить некоторые письма из списка 'data.txt', где их sh фигурирует в другом списке 'MD5.txt'

ниже - скрипт, который я создал (он работает нормально, но только для небольших файлов)

function Get-MD5{
    Param ([String]$mail)
    $md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
    $utf8 = New-Object -TypeName System.Text.UTF8Encoding
    $hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($mail)))
    $hash = $hash.Replace('-','')
    return [String]$hash
    }

    $data = gc $dataPath
    $unsub = gc $MD5Path #ReadCount 5000 -Raw not better    
    foreach($d in $data){
        $t = Get-MD5 "$d"
        if($unsub -like "*$t*"){    
            $data | Where-Object { $_ -notmatch "$d" } | Out-File -FilePath "$dataPath"
        }
    }

проблема, с которой я сталкиваюсь, заключается в том, что файл MD5 слишком велик (более 1 ГБ), поэтому даже при 16 ГБ ОЗУ сценарий не может сравнить каждую строку (почта) с миллионами строк MD5. (это составляет 30 секунд для каждой строки)

Любые идеи, как я могу сделать эту задачу быстрее? спасибо

1 Ответ

1 голос
/ 11 апреля 2020

Я могу предложить несколько советов, но без реальных файлов и тестирования, теперь я уверен, насколько это будет лучше.

  • Избегайте использования "|" настолько, насколько это возможно, это замедляет все
  • вы можете использовать -readcount 0, чтобы прочитать весь файл сразу, у вас достаточно оперативной памяти для его обработки
  • Вместо записи в файл снова и снова , что потребует от вас доступа к диску, выполнения операции с памятью и одновременной записи.
  • like - медленный оператор, попробуйте заменить его на match, который примерно в 10 раз быстрее
  • I Также взглянем на объект сравнения и посмотрим, сможете ли вы использовать этот diff. Например, A: весь список, B: список электронных писем, которые нужно удалить, diff - это то, что вы хотите, чтобы конечный вывод был (AB)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...