私はメモリにロードする余裕がない膨大なファイルがあり、内部で見つける必要があるバイトシーケンスがあります。巨大なファイルをメモリにロードせずに検索する方法はありますか?
これは私が今使用しているものである:
public static byte[] GetRangeFromStream(ref FileStream fs, long start_index, long count)
{
byte[] data = new byte[count];
long prev_pos = fs.Position;
fs.Position = start_index;
fs.Read(data, 0, data.Length);
fs.Position = prev_pos;
return data;
}
public static long GetSequenceIndexInFileStream(byte[] seq, ref FileStream fs, long index, bool get_beginning = true)
{
if (index >= fs.Length)
return -1;
fs.Position = index;
for (long i = index; i < fs.Length; i++)
{
byte temp_byte = (byte)fs.ReadByte();
if (temp_byte == seq[0] && IsArraysSame(seq, GetRangeFromStream(ref fs, i, seq.Length))) //compare just first bytes and then compare seqs if needed
return i;
}
return -1;
}
シーケンスをメモリに格納しますか?はいの場合、チャンク内のファイルを読み込み、各チャンク内のシーケンスを検索します。シーケンスが2つのチャンクに分割されている場合の処理について覚えておいてください。 – janisz
誰があなたを落としてしまったのか、なぜ、それが完璧に良い技術的な質問なのかは分かりません。 – PhillipH
@janisz - はい、それは合っていますが、最初のバイトを比較してseqを比較するのではなく、常に 'seq'と' chunk'を比較します。それとも、私はあなたを間違って理解していますか? – Kosmos