[解決済み] PowerShellでファイルをストリームとして一行ずつ処理する方法
2023-01-19 12:13:37
質問
数ギガバイトのテキストファイルを扱っていて、PowerShellを使用してそれらのストリーム処理を行いたいと考えています。それは単純なもので、各行をパースしていくつかのデータを取り出し、それをデータベースに格納するだけです。
残念ながら
get-content | %{ whatever($_) }
は、パイプのこの段階での行のセット全体をメモリに保持しているように見えます。また、驚くほど遅く、実際にすべてを読み込むのに非常に長い時間がかかります。
だから私の質問は2つの部分です。
- ストリームを行ごとに処理し、全体をメモリにバッファリングしておかないようにするにはどうしたらよいでしょうか。私は、この目的のために数ギガの 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' } }
UPDATEです。 もし、まだ怖くないのであれば、.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
}
関連
-
[解決済み] NULL 値の式でメソッドを呼び出すことはできない
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] インストールされたPowerShellのバージョンを確認する
-
[解決済み] PowerShellで「このシステムではスクリプトの実行が無効になっています」と言われる。
-
[解決済み] PowerShellでコードをコメントアウトする方法とは?
-
[解決済み] 文字列からストリームを生成するにはどうすればよいですか?
-
[解決済み] Windows PowerShellの環境変数を設定する
-
[解決済み] PowerShellで文字列と変数を連結する方法は?
-
[解決済み] PowerShellでコマンドライン引数を処理する方法
-
[解決済み】PowerShellスクリプトを実行する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】powershellにターミネーターがない。"
-
[解決済み】Invoke-Command エラー "Parameter set cannot be resolved using specified named parameters".
-
[解決済み】powershellで再利用するために資格情報を保存すると、ConvertTo-SecureString : Key not valid for use in specified stateというエラーが発生する。
-
[解決済み] ConvertTo-Csv 引用符なしの出力
-
[解決済み] Invoke-Sqlcmd エラー : リモート DB サーバを呼び出すために powershell を実行すると、ユーザ xxxx のログインに失敗しました。
-
[解決済み] PowerShellでデータをCSVにエクスポートする方法は?
-
[解決済み] PowerShellでコンソールに書き込むには?
-
[解決済み] いずれかのキーを押して続行[複製]。
-
[解決済み] powershell内でキーストロークを実行する方法は?
-
[解決済み] PowerShellでファイルを一行ずつ読み込む