12

正規表現を使用するために文字列に変換する必要がある非常に大きな char 配列があります。しかし、それを文字列コンストラクターに渡すと
非常に大きくなります。OutOfMemoryException

文字列が不変であることはわかっているため、基になる文字コレクションを指定することはできませんが、全体をコピーせずに正規表現を使用する方法が必要です。

その配列を取得するにはどうすればよいですか?

  • を使用してファイルから取得しますStreamReader。読み取るコンテンツの開始位置と長さを知っておりReadReadBlockメソッドはchar[]バッファを提供する必要があります。

だからここに私が知りたいことがあります:

  • 文字列の基になるコレクションを指定する方法はありますか? (文字を配列に保持しますか?)
  • ...または char 配列で直接正規表現を使用しますか?
  • ...またはファイルの一部を文字列として直接取得しますか?
4

4 に答える 4

1

検索しようとしているパターンにないことが保証されている検索可能な文字またはパターンがある場合は、その文字の配列をスキャンし、個別に処理する小さな文字列を作成できます。プロセスは次のようになります。

char token = '|';
int start = 0;
int length = 0;
for(int i = 0; i < charArray.Length; i++;)
{
    if(charArray[i] == token)
    {
        string split = new string(charArray,start,length);
        // check the string using the regex

        // reset the length
        length = 0;
    }
    else
    {
        length++;
    }
}

そうすれば、文字列全体ではなく、試行ごとに GC される文字列の小さなセグメントをコピーできます。

于 2012-10-31T13:22:06.753 に答える
0

やや醜いオプションの 1 つは、アンマネージ RegEx ライブラリ (POSIX 正規表現ライブラリなど) と安全でないコードを使用することです。char 配列への byte * ポインターを取得し、それをアンマネージ ライブラリに直接渡し、応答をマーシャリングして戻すことができます。

fixed (byte * pArray = largeCharArray)
{
   // call unmanaged code with pArray
}
于 2012-10-30T21:07:38.700 に答える
0

あなたの最善の策は、複数の char[] チャンクを特定の次元と重複する個々の文字列に読み込むことだと思います。このようにして、個々のチャンクで正規表現を実行でき、オーバーラップにより、チャンクの「ブレーク」が検索パターンを壊さないようにすることができます。疑似コードの方法で:

int chunkSize = 100000;
int overLap = 2000;

for(int i = 0; i < myCharArray.length; i += chunkSize - overlap)
{
    // Grab your array chunk into a partial string
    // By having your iteration slightly smaller than 
    // your chunk size you guarantee not to miss any 
    // character groupings. You just need to make sure
    // your overlap is sufficient to cover the expression
    string chunk = new String(myCharArray.Skip(i).Take(chunkSize).ToArray());
    // run your regex
}
于 2012-10-30T19:55:06.503 に答える
-2

.NET 4.0以降を使用している場合、使用する必要があるのはMemoryMappedFileです。このクラスは、非常に大きなファイルを操作できるように排他的に設計されています。MSDNドキュメントから:

メモリマップトファイルは、ファイルの内容をアプリケーションの論理アドレス空間にマップします。メモリマップトファイルを使用すると、メモリを同時に管理できるため、プログラマーは非常に大きなファイルを操作できます。また、シークすることなく、ファイルに完全にランダムにアクセスできます。メモリマップトファイルは、複数のプロセス間で共有することもできます。

メモリマップトファイルを入手したら、RegExをメモリマップトファイルに適用する方法について、このStackOverflowの回答を確認してください。

お役に立てれば!

于 2012-10-30T20:06:30.733 に答える