ながーい文字列を作ってテキストファイルに落とす方法

お久しぶりです。
最近ようやくPowerShell v2を触り始めました。(えー)
あのISEがよくできてていいですな。

 さて、今回もちょっとしたTipsを。というか試行錯誤を。v1の話です。

1GBのASCII文字列(なんでもいいんですが)をテキストファイルに書き込みたい。

まずためしたこと:

PS C:\Users\daisuke> Set-Content test.txt ("a"*1GB)
'*' 演算子が失敗しました:種類 'System.OutOfMemoryException' の例外がスローされました。
発生場所 行:1 文字:27+ Set-Content test.txt ("a"*1 <<<< GB)

いきなり1GBの文字列を発生させると、メモリが足りないって怒られました。環境にもよるんでしょうけどこれは正道ではなさそうです。

次に試したこと:

PS C:\Users\daisuke> 1..1GB|%{Add-Content test.txt "a"}
範囲の式が正しくありません。1073741823 は、範囲の最大サイズ (=50000 要素) を超えています。
発生場所 行:1 文字:4+ 1..1 <<<< GB|%{Add-Content test.txt "a"}

ループは5万回までしか回せないらしいです。むむむ。じゃあループ回数を減らそう。

PS C:\Users\daisuke> 1..1KB | %{Add-Content test.txt ("a"*1MB)}

うまく行きました!1GBのテキストファイルができあがりました。やった。

1MBも一回のループで書き込むのがいいのか分からないし、厳密にはちゃんとループ回数も考えてあげたほうがいいんだろうけど、1GB=1KB*1MBなのを利用してしまいました。

ただ、インデックスサーチ?かなんかが割り込みかけるみたいで、たまに

Add-Content : 別のプロセスで使用されているため、プロセスはファイル 'C:\Users\da
isuke\test.txt' にアクセスできません。
発生場所 行:1 文字:23
+ 1..1KB | %{Add-Content  <<<< test.txt ("a"*1MB)}

とか例外吐きます。ちゃんと排他制御も考えるとこれじゃダメっぽいです。ファイルにロックとかかけられないのかなー?

コメント

タイトルとURLをコピーしました