Конвертировать файлы в UTF-8: Get-Content: было сгенерировано исключение типа System.OutOfMemoryException - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь преобразовать большие файлы файлов данных в UTF-8, чтобы загрузить их в базу данных (файлы имеют японские символы на них).Самый большой файл - 17 ГБ, а весь каталог - 34 ГБ.Ниже приведен мой скрипт PowerShell.

$files = Get-ChildItem 'E:\datamig_bkp_SCMDB\data\bigfiles' -Recurse |
         ? {Test-Path $_.FullName -PathType Leaf}
foreach ($file in $files) {
    $content = Get-Content $file.FullName
    $content | Out-File $file.FullName -Encoding UTF8
}

Я получаю сообщение об ошибке ниже:

Get-Content : Exception of type 'System.OutOfMemoryException' was thrown.
At line:3 char:16
+     $content = Get-Content $file.FullName
+                ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Get-Content], OutOfMemoryException
    + FullyQualifiedErrorId : ProviderContentReadError,Microsoft.PowerShell.Commands.GetContentCommand

1 Ответ

0 голосов
/ 02 октября 2018

Не читайте большие файлы в память.Запишите выходные данные в новый (временный) файл, затем удалите исходный файл и переместите временный файл на его место.

$tmp = 'C:\path\to\temp.txt'
Get-ChildItem 'E:\datamig_bkp_SCMDB\data\bigfiles' -Recurse | Where-Object {
    -not $_.PSIsContainer
} | ForEach-Object {
    $file = $_.FullName
    Get-Content $file | Out-File $tmp -Encoding UTF8
    Remove-Item $file -Force
    Move-Item $tmp $file
}

Как указал TheIncorrigible1 в комментариях, код может быть немного упрощен, когда выесть PowerShell v3 или новее:

$tmp = 'C:\path\to\temp.txt'
Get-ChildItem 'E:\datamig_bkp_SCMDB\data\bigfiles' -Recurse -File | ForEach-Object {
    $file = $_.FullName
    Get-Content $file | Out-File $tmp -Encoding UTF8
    Remove-Item $file -Force
    Move-Item $tmp $file
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...