バイナリファイルがあります。私はそれをバイト配列に格納しました。ファイル サイズは 20MB 以上になる場合があります。次に、ファイル内の特定の値を解析または検索します。私は2つの方法でそれをやっています-> 1.完全なファイルをchar配列に変換することによって。2.ファイル全体を16進文字列に変換することにより(16進値もあります)
ファイル全体を解析する最良の方法は何ですか..またはバイナリ形式で行うべきですか. 私はvs-2005を使用しています。
バイナリファイルがあります。私はそれをバイト配列に格納しました。ファイル サイズは 20MB 以上になる場合があります。次に、ファイル内の特定の値を解析または検索します。私は2つの方法でそれをやっています-> 1.完全なファイルをchar配列に変換することによって。2.ファイル全体を16進文字列に変換することにより(16進値もあります)
ファイル全体を解析する最良の方法は何ですか..またはバイナリ形式で行うべきですか. 私はvs-2005を使用しています。
メモリ消費の観点からは、オンザフライで直接解析できることが最善です。
C# で char 配列に変換すると、メモリ内のサイズが実質的に 2 倍になりますが (それぞれbyte
を に変換すると仮定char
)、16 進文字列は少なくとも 4 倍のサイズになります (C# char は 16 ビットの Unicode 文字です)。
一方、既存のデータ セットを繰り返し解析して多くの検索を行う必要がある場合は、必要に応じて任意の形式でデータを保存することでメリットが得られる場合があります。
バイト[]で検索するのを妨げているのは何ですか? IMHO、指定された値のバイト、または連続する複数のバイトを単に検索している場合、これが最も簡単で効率的な方法です。
私があなたの質問を正しく理解していれば、大きなバイナリ ファイル内の任意の文字を含む文字列を見つける必要があります。バイナリ ファイルにテキストが含まれていますか? もしそうなら、あなたはエンコーディングを知っていますか?その場合、次のように StreamReader クラスを使用できます。
using (StreamReader sr = new StreamReader("C:\test.dat", System.Text.Encoding.UTF8))
{
string s = sr.ReadLine();
}
いずれにせよ、すべてをメモリにロードするのではなく、ファイルへの何らかのストリームアクセスを使用する方がはるかに効率的だと思います。チャンクごとにメモリにロードし、パターン マッチング アルゴリズム (Knuth-Moris-Pratt や Karp-Rabin など) を使用できます。