PowerShell 7.1 1 GB のテキスト UTF8 テキスト ファイルを 1 つの文字列に読み込んでいます。値が 127 より大きいすべての文字を検索し、その前に 2 文字をマーカーとして挿入する効率的な方法を探していました。たとえば、文字列には Unicode 10 進数の 12288 が全体に埋め込まれています。char コード 128 が必要です。次に、シーケンス内の文字数 (または 16 進数の方が良いと思われる場合は 16 進数) を保持する別の char が必要です。
FOR ループ ($i=0; $i -lt $text.length; $i++) を使用しようとした場合、[int]$text[$i] をチェックして、127 より大きい次の文字を見つけます。 $left+[char]128+$nonAsciirunlen+$right を使用してマーカーを挿入します
$text が [char]12288+' A '+[char]12288+[char]12288 の場合、128,1, 12288, 32, 65, 32, 128, 2, の [int] 値に変更されます。 12288、12288
問題は、一晩実行され、最初の約 350,000 しか処理されなかったことです。約10分で処理する必要がありますが、1時間でも構いません。
私の目標は、128 のマーカーとシーケンス長で char シーケンスをマークすることです。速度の問題は、文字列の左側、2 つのマーカー コード、そして文字列の右側を追加するたびにすべてが遅くなることです。文字列を連結するたびに PowerShell がメモリを解放していない可能性があると推測していますが、それは単なる推測です。メモリ使用量は見ていません。私は24GBのRAMを持っています。
-encoding UTF8 と Format-Hex を使用して文字列を 16 進数に変換しようとしましたが、10MB のセクションでも Format-Hex からメモリ配列例外が発生します。これはバイトレベルで機能していますが、同じ概念です。スキップする複数のバイトシーケンスの数は、実際の文字数をスキップするよりもサイズが大きくなります。
どんなアイデアでも大歓迎です。
これは、私が処理することができた中で最速です。これにより、別のアプリケーションが、マルチバイト文字でクラッシュすることなく、変更された UTF8 テキスト ファイルを処理できるようになります。
$t = [char]12288 + 'A' + [char]12288 + [char]12288 + [char]12288 + ' BC'
$m = [char]128
$len = 0
$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
for ($i = 0; $i -lt $t.length; $i++) {
if (([int]$t[$i]) -lt 128) { continue; }
$oi = $i
while (([int]$t[$i]) -gt 127) { $i++; $len++ }
$l = $t.Substring(0, $oi)
$r = $t.Substring($oi)
$t = $l + $m + [char]$len + $r
$i = $i + 2
$len = 0
} #next $i
write-host $stopwatch.Elapsed.TotalSeconds
#Display results
clear
for ($i = 0; $i -lt $t.Length; $i++) {
$d = [int]$t[$i];
write-host $d ',' -NoNewline
}; write-host