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

by 牟田口大介 14. 5月 2009 23:12

お久しぶりです。
最近ようやく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)}

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

最新のブログ

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

PowerShell ISE | Tips

コメント

コメントを書く


 

  Country flag

biuquoteredbluegreenyellowPowerShellTextFile
  • コメント
  • プレビュー
Loading



Calendar

<<  3月 2010  >>
月曜火曜水曜木曜金曜土曜日曜
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

View posts in large calendar
Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2010 PowerShell from Japan!!