ファイルが大きすぎず、メモリを節約してください。ファイル全体をスラップするだけで、速くてstring.find
を使用してください。そうでなければ、ブロック単位でファイルを検索できます。
あなたのアプローチはそれほど悪くはありません。私は重複するブロックでファイルをロードすることをお勧めします。
".... ...A BC.. ...."
私の実装では、このように書き:あなたのファイルが実際にラインを持っている場合
size=4096 -- note, size should be bigger than the length of pat to work.
pat="ABC"
overlap=#pat
fh=io.open(filepath,'rb') -- On windows, do NOT forget the b
block=fh:read(size+overlap)
n=0
while block do
block_offset=block:find(pat)
if block_offset then
print(block_offset)
offset=block_offset+size*n
break
end
fh:seek('cur',-overlap)
cur=fh:seek'cur'
block=fh:read(size+overlap)
n=n+1
end
if offset then
print('found pattern at', offset, 'after reading',n,'blocks')
else
print('did not find pattern')
end
、あなたも説明したトリックを使用することができ、オーバーラップは、パターンがわずか数ブロックと同じよう見過ごさ行くの間で分割がなくなりhere。 Programming in LuaのThis sectionでは、ファイルを読む際のパフォーマンス上の考慮事項について説明しています。
ありがとうございました!それは魅力のように働く。私はセクション21.1まで進んだ。私の質問を投稿する前に、私は21.2.1を逃したので、ヒントのためにありがとう! "#"シンボルの概念にまだ慣れていません。どうやらそれを使用して重複を作成したのですが、その使用法を詳細に説明するセクションと、重複サイズなどの機能は、Luaコードブックにありますか? – Zerobinary99
実際のコードで私の答えを洗い流してくれてありがとう。 – lhf
'# '演算子は文字列の長さ、シーケンスであるテーブル(キーは1からn、穴なし)、または__lenメタメソッドを定義するオブジェクトを返します。文字列の長さは*バイト数であり、必ずしも文字数に等しいとは限りません(UTF-8などと考えてください)。 – jpjacobs