2016-04-06 3 views
1

Ich versuche, eine Reihe von großen Dateien zu durchsuchen und Teile des Textes zu ersetzen, aber ich laufe weiterhin in Fehler.Verwenden Sie .NET für schnelles Lesen/Schreiben von großen Dateien

Ich habe versucht, diese, aber manchmal werde ich eine 'out of memory' Fehler in Powershell diese

#region The Setup 
$file = "C:\temp\168MBfile.txt" 

$hash = @{ 
    ham = 'bacon' 
    toast = 'pancakes' 
} 
#endregion The Setup 

$obj = [System.IO.StreamReader]$file 
$contents = $obj.ReadToEnd() 
$obj.Close() 

foreach ($key in $hash.Keys) { 
    $contents = $contents -replace [regex]::Escape($key), $hash[$key] 
} 
try { 
    $obj = [System.IO.StreamWriter]$file 
    $obj.Write($contents) 
} finally { 
    if ($obj -ne $null) { 
     $obj.Close() 
    } 
} 

dann habe ich versucht, bekommen (in der ISE), aber es stürzt mit einer Popup-Nachricht (sorry, den Fehler nicht auf der Hand) und versucht, die ISE

$arraylist = New-Object System.Collections.ArrayList 
$obj = [System.IO.StreamReader]$file 
while (!$obj.EndOfStream) { 
    $line = $obj.ReadLine() 
    foreach ($key in $hash.Keys) { 
     $line = $line -replace [regex]::Escape($key), $hash[$key] 
    } 
    [void]$arraylist.Add($line) 
} 
$obj.Close() 
$arraylist 

und schließlich neu zu starten, stieß ich auf so etwas, aber ich bin nicht sicher, wie es richtig zu nutzen, und ich bin nicht einmal sicher, wenn ich das richtig mache.

$sourcestream = [System.IO.File]::Open($file) 
$newstream = [System.IO.File]::Create($file) 
$sourcestream.Stream.CopyTo($newstream) 
$sourcestream.Close() 

jeder Rat würde sehr geschätzt werden.

Antwort

0

Sie können mit Readcount von 1000 beginnen und zwicken sie basiert Sie auf die Leistung erhalten:

get-content textfile -Readcount 1000 | 
    foreach-object {do something} | 
    set-content textfile 

oder

(get-content textfile -Readcount 1000) -replace 'something','withsomething' | 
set-content textfile 
+0

Okay, so wie bekomme ich alle Zeilen, nachdem ich bin fertig mit den ersten 1000? –

+0

aus der Hilfedatei: '-ReadCount Gibt an, wie viele Inhaltszeilen gleichzeitig durch die Pipeline gesendet werden. Der Standardwert ist 1. Ein Wert von 0 (Null) sendet den gesamten Inhalt auf einmal. Dieser Parameter ändert nicht den angezeigten Inhalt, aber die Zeit, die zum Anzeigen des Inhalts benötigt wird. Wenn der Wert von ReadCount erhöht wird, erhöht sich die Zeit, die benötigt wird, um die erste Zeile zurückzugeben, aber die Gesamtzeit für die Operation nimmt ab. Dies kann bei sehr großen Objekten einen wahrnehmbaren Unterschied machen. – Kiran

+0

Funktioniert Ihr Beispiel, wenn ich versuche, in dieselbe Datei zu schreiben, von der ich gerade lese? –

Verwandte Themen