2014-10-15 3 views
0

나는 다음과 같은 명령을 사용하여 몇 가지 문제가 있어요 :PowerShell을 얻을 컨텐츠에 OutOfMemory

Get-Content -Encoding Byte -ReadCount 0 $FilePath_All, $FilePath_Int | Set-Content -Encoding Byte -Force $ImpDayFPath 

파일이 200~300메가바이트 사이에있다.

OutOfMemoryException가 발생합니다. 기계에는 8Gb가 있지만 사용 된 오류는 4Gb뿐입니다.

은 내가 Documentation 내가 벤치 마크 테스트 성능 예제를 찾을 수 없었기 때문에 난 그냥 0을 쓴

-ReadCount<Int64> 

Specifies how many lines of content are sent through the pipeline at a time. 
The default value is 1. A value of 0 (zero) sends all of the content at one time. 

This parameter does not change the content displayed, but it does affect the time 
it takes to display the content. As the value of ReadCount increases, the time 
it takes to return the first line increases, but the total time for the operation 
decreases. This can make a perceptible difference in very large items. 

...

파일이 더 많거나 적은 270k 라인을 포함 확인. 내가 외부 루프를 가지고 있고 시간이 O (n^2)가 될 것이기 때문에 하나씩가는 것이 성능에 문제를 일으킬 수있다.

내가 사용할 수있는 가치에 대해 알고 싶습니까?

+0

레거시 파일의 내용을 가져와 새 파일에서 수정되었거나 (LastWriteTime) 수정되었는지 확인해야합니다. 파일은 텍스트 기반입니다. – blfuentes

+0

전체 파일을 한 번에 읽고 (ReadCount 0), 한 줄씩 비교할 수 있으면 많은 메모리를 절약 할 수 있습니다. – ojk

+0

예, 압니다. 설명서를 확인했습니다. http://technet.microsoft.com/en-us/library/hh849787.aspx 그러나이 문제에 익숙하지 않아 "공통 가치"를 선택할 수 없습니다. – blfuentes

답변

1

이진 데이터를 읽는 경우 공식 문서에서 찾은 내용을 기반으로 Get-Content cmdlet을 사용하여 파이프 라인을 통해 스트리밍되는 행의 양을 실제로 변경할 수 있는지 확실하지 않습니다. .

"에서 읽기와 바이너리 파일에 기록 할 때, 인코딩 동적 인 매개 변수와 ReadCount 매개 변수에 0의 값을 바이트의 값을 사용하십시오 ReadCount 값 : 여기 TechNet의 here에서 발견 관련 단락입니다 0은 단일 읽기 작업에서 전체 파일을 읽고이를 단일 객체 (PSObject)로 변환합니다. 기본 ReadCount 값인 1은 각 읽기 작업에서 1 바이트를 읽고 각 바이트를 개별 객체로 변환하므로 사용자가 Set-Content cmdlet을 사용하여 바이트를 파일에 씁니다. 자세한 내용은 예제를 참조하십시오. " http://msdn.microsoft.com/en-us/library/system.io.binaryreader.aspx :

그러나, 여기에있는 BinaryReader를 클래스를 사용하여, (바이너리 형식 내가 있으리라 믿고있어에) 큰 파일을 읽을 수있을 수 있습니다. 또는 UnmanagedMemoryStream .Net 클래스를 사용하는 거대한 이진 파일의 경우 사용되는 메모리 양을 제한하지 않습니다. 자세한 내용은 여기를 참조하십시오 ... http://msdn.microsoft.com/en-us/library/System.IO.UnmanagedMemoryStream(v=vs.110).aspx

-1

Compare-Object를 사용하여 파일의 내용을 비교할 수 있습니다. 다음 코드를 고려하십시오.

Compare-Object -ReferenceObject $(Get-Content .\file1.txt) -DifferenceObject $(Get-Content .\file2.txt) 

기본 동작은 파일 간의 차이점 만 표시하는 것입니다. 이것을 알면 다음과 같은 차이점을 테스트 할 수 있습니다.