PowerShell에서 파일을 한 줄씩 스트림으로 처리하는 방법
수 기가바이트 텍스트 파일을 사용하고 있는데 PowerShell을 사용하여 스트림 처리를 하고 싶습니다.간단한 작업입니다. 각 행을 구문 분석하여 데이터를 추출한 후 데이터베이스에 저장합니다.
불행하게도,get-content | %{ whatever($_) }
는 파이프의 이 단계에 있는 모든 라인 세트를 메모리에 저장하는 것으로 보입니다.또한 놀랍게도 속도가 느려서 실제로 모든 내용을 읽는 데 오랜 시간이 걸립니다.
그래서 제 질문은 두 가지입니다.
- 어떻게 하면 전체 데이터를 메모리에 버퍼링하지 않고 스트림을 한 줄씩 처리하게 할 수 있을까요?이를 위해 몇 기가바이트의 RAM이 소모되는 것을 피하고 싶습니다.
- 어떻게 하면 더 빨리 실행할 수 있을까요?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
'programing' 카테고리의 다른 글
윤곽 반지름? (0) | 2023.04.08 |
---|---|
SQL Server 쿼리: 테이블의 열 목록과 데이터 유형, NOT NULL 및 Primary KEY 제약 조건을 가져옵니다. (0) | 2023.04.08 |
디렉토리가 존재하지 않는 경우 작성 (0) | 2023.04.08 |
PowerShell을 사용한 파일 이름 타임스탬프 (0) | 2023.04.08 |
SQL Server에서 단일 ALTER TABLE 문을 사용하여 여러 열을 드롭하려면 어떻게 해야 합니까? (0) | 2023.04.08 |