2011-07-03 4 views
4

Get-ChildItem이 수백만 개의 항목을 반환한다고 말하십시오. PowerShell은 이것을 어떻게 처리합니까? 데이터를 일괄 적으로 처리 할 수 ​​있습니까? 데이터가 검색 될 때까지 명령이 콘솔을 차단합니까?PowerShell은 대용량 데이터 집합을 어떻게 처리합니까?

전 PowerShell을 처음 사용하기 때문에 많은 항목을 반환하는 작업을 처리하는 기본 원칙을 설명하거나 완료하는 데 시간이 많이 걸릴 수 있습니다.

답변

6

Powershell cmdlet은 한 번에 한 레코드 씩 데이터를 처리합니다. get-childitem의 출력을 스크립트 블록이나 다른 cmdlet으로 파이프하면 두 가지를 모두 병렬로 실행해야합니다. 말하자면 get-childitem이 레코드를 검색하는 동안 스크립트 블록은 레코드가 사용 가능하자마자 실행됩니다. 물론 콘솔 응용 프로그램이므로 레코드 처리 중에 더 많은 데이터를 요구하거나 사용자가 명령을 종료하지 않는 한 콘솔은 모든 레코드가 처리 될 때까지 차단됩니다. 시간/리소스를 많이 사용하는 처리가 있으면 cmdlet에서 백그라운드 작업을 사용하는 것이 좋습니다 (this msdn article 참조).

+1

기술적으로 ProcessRecord 메서드가 자신의 데이터 구조에 레코드를 누적시킨 다음 EndProcessing 메서드에서 출력을 처리/생성하도록함으로써 레코드를 일괄 처리 할 수도 있습니다. 그러나 이렇게해야하는 이유는 많지 않습니다. 추가 메모리 요구 사항을 피하고 고유 한 병렬 처리를 활용하려면 레코드를 스트림으로 처리하는 것이 항상 좋습니다. –

+1

좋은 대답입니다. cmdlet 내의 Begin, Process 및 End 문도 생각하게 만들었습니다. 나는이 속성을 언급 할 가치가 있다고 생각합니다. 첫 번째 레코드가 처리되기 전에 시작이 한 번 수행되며, 각 레코드에 대해 프로세스가 반복되고 마지막 레코드가 실행됩니다. 질문과 관련이 없지만 커스텀 cmdlet으로 많은 양의 데이터를 처리 할 것인지를 아는 것이 중요합니다. (맞춤법 오류에 사과드립니다 !!) – Matt

관련 문제