のGet-コンテンツおよび測定・オブジェクトを小さなファイルの罰金ですが、両方ともメモリで超非効率的である私は、大容量のファイルを持つ本当の問題を抱えていた
とき。数えるどの方法を使っても1GBファイル内の行になり、Powershellはサーバー上の使用可能なすべてのメモリ(8GB)を突っ込み、ディスクへのページングを開始しました。私は1時間以上それを残しましたが、それはまだディスクにページングしていましたので、私はそれを殺しました。
大容量ファイルで最も良い方法は、IO.StreamReaderを使用してディスクからファイルをロードし、変数を使用して各ローをカウントすることです。これにより、メモリ使用量は25MBと非常に妥当なものになります.1GBファイルで行を数えるのに30秒かかります.6GBファイルでは数分かかります。それは関係なく、あなたのファイルがどのように大規模な、RAMの不合理な量を食べることはありません:
[int]$LinesInFile = 0
$reader = New-Object IO.StreamReader 'c:\filename.csv'
while($reader.ReadLine() -ne $null){ $LinesInFile++ }
あなたが得るコンテンツまたはメジャー・オブジェクトを使用することになりどこ上記のスニペットを挿入することができ、単純に$ LinesInFile変数を参照してください。ファイルの行数を取得します。
感謝を返され、これが動作しているようですが、それは例えば比較ひどく遅いですGNU Unix utils wc.exeへ。 – jrara
これは、wc.exeが(Get-Content).Lengthと同等であるため、Import-CSVよりもはるかに高速ですが、stejが指摘する潜在的に間違った解決策でもあります。複数行のフィールド。 – EBGreen
すばらしいもの。ちょうど私が必要なもの... –