programing

PowerShell에서 파일을 한 줄씩 스트림으로 처리하는 방법

powerit 2023. 4. 8. 09:51
반응형

PowerShell에서 파일을 한 줄씩 스트림으로 처리하는 방법

수 기가바이트 텍스트 파일을 사용하고 있는데 PowerShell을 사용하여 스트림 처리를 하고 싶습니다.간단한 작업입니다. 각 행을 구문 분석하여 데이터를 추출한 후 데이터베이스에 저장합니다.

불행하게도,get-content | %{ whatever($_) }는 파이프의 이 단계에 있는 모든 라인 세트를 메모리에 저장하는 것으로 보입니다.또한 놀랍게도 속도가 느려서 실제로 모든 내용을 읽는 데 오랜 시간이 걸립니다.

그래서 제 질문은 두 가지입니다.

  1. 어떻게 하면 전체 데이터를 메모리에 버퍼링하지 않고 스트림을 한 줄씩 처리하게 할 수 있을까요?이를 위해 몇 기가바이트의 RAM이 소모되는 것을 피하고 싶습니다.
  2. 어떻게 하면 더 빨리 실행할 수 있을까요?PowerShell의 반복은get-content는 C# 스크립트보다 100배 느린 것으로 보입니다.

내가 여기서 뭘 하고 있는 바보같은 일이 있길 바라네-LineBufferSize파라미터 같은 거...

수 기가바이트 텍스트 파일로 작업하려는 경우 PowerShell을 사용하지 마십시오.더 빨리 읽을 수 있는 방법을 찾아도 PowerShell에서는 대량의 행 처리가 느려지고 이를 피할 수 없습니다.단순한 루프도 비용이 많이 듭니다.예를 들어 1000만 번의 반복(고객의 경우 실제)을 실시하면 다음과 같은 이점이 있습니다.

# "empty" loop: takes 10 seconds
measure-command { for($i=0; $i -lt 10000000; ++$i) {} }

# "simple" job, just output: takes 20 seconds
measure-command { for($i=0; $i -lt 10000000; ++$i) { $i } }

# "more real job": 107 seconds
measure-command { for($i=0; $i -lt 10000000; ++$i) { $i.ToString() -match '1' } }

업데이트: 그래도 두렵지 않으면 를 사용해 보십시오.NET 리더:

$reader = [System.IO.File]::OpenText("my.log")
try {
    for() {
        $line = $reader.ReadLine()
        if ($line -eq $null) { break }
        # process the line
        $line
    }
}
finally {
    $reader.Close()
}

업데이트 2

더 나은 코드/짧은 코드에 대한 댓글이 있습니다.원래 코드에는 문제가 없습니다.for의사 코드가 아닙니다.단, 판독 루프의 가장 짧은(가장 짧은) 변형은

$reader = [System.IO.File]::OpenText("my.log")
while($null -ne ($line = $reader.ReadLine())) {
    $line
}

System.IO.File.ReadLines()이 시나리오에 최적입니다.파일의 모든 행이 반환되지만, 즉시 행에 걸쳐 반복을 시작할 수 있습니다.즉, 전체 내용을 메모리에 저장할 필요가 없습니다.

가 필요합니다.NET 4.0 이후

foreach ($line in [System.IO.File]::ReadLines($filename)) {
    # do something with $line
}

http://msdn.microsoft.com/en-us/library/dd383503.aspx

스트레이트 PowerShell을 사용하려면 아래 코드를 확인하십시오.

$content = Get-Content C:\Users\You\Documents\test.txt
foreach ($line in $content)
{
    Write-Host $line
}

언급URL : https://stackoverflow.com/questions/4192072/how-to-process-a-file-in-powershell-line-by-line-as-a-stream

반응형