6

より大きな(> 500M)バイナリファイルで構造体/パターンをスキャンするのが好きです。私はこの言語に不慣れで、誰かが私に始めてくれることを願っています。実際、ファイルはセグメントを含むデータベースです。セグメントは、固定サイズのヘッダーで始まり、固定サイズのオプション部分が続き、可変長のペイロード/データ部分が続きます。最初のテストでは、ファイル内のセグメント数をログに記録するのが好きです。私はすでにいくつかのチュートリアルをグーグルで検索しましたが、役立つものは何も見つかりませんでした。開始するには、ユースケースからそれほど遠くないヒントまたはチュートリアルが必要です。

ステファンに挨拶

4

3 に答える 3

4

ビット構文バイナリ内包表記について学ぶ必要があります。従うべきより有用なリンク:http ://www.erlang.org/documentation/doc-5.6/doc/programming_examples/bit_syntax.html 、およびhttp://goto0.cubelogic.org/a/90

また、ファイルの処理方法、ファイルからの読み取り(行ごと、チャンクごと、ファイル内の特定の位置など)、ファイルへの書き込み方法についても学ぶ必要があります。ここではファイル処理機能について説明します。ディスクログDetsmnesia

などのerlangパッケージ内の大きなファイル処理ライブラリのソースコードを確認することもできます。。これらのライブラリはファイルの読み取りと書き込みを頻繁に行い、ソースコードは公開されています。

お役に立てば幸いです

于 2012-06-13T12:20:57.693 に答える
1

データがメモリに収まる場合、最善の方法は、 を使用してデータ全体を読み取ることですfile:read_file/1。ファイルをrawモードで使用できない場合。次に、bit_syntax を使用してデータを解析できます。正しく記述すれば、HiPE を使用して解析モジュールをコンパイルすると、数十 MB/秒の解析速度を達成できます。解析の正確な手法は、正確なセグメント データ形式と、探している堅牢性/正確な結果によって異なります。並列解析については、Tim Bray の Wide Finder プロジェクトを参考にしてください。

于 2012-06-16T14:01:59.667 に答える
1

合成されたサンプル問題を次に示します。解析したいバイナリ ファイル ( test.txt ) があります。<<$a, $b, $c>>ファイル内のすべてのバイナリ パターンを検索したい。

test.txt」の内容:

I arbitrarily decide to choose the string "abc" as my target string for my test. I want to find all the abc's in my testing file.

サンプル プログラム ( lab.erl ):

-module(lab).
-compile(export_all).

find(BinPattern, InputFile) ->
    BinPatternLength = length(binary_to_list(BinPattern)),
    {ok, S} = file:open(InputFile, [read, binary, raw]),
    loop(S, BinPattern, 0, BinPatternLength, 0),
    file:close(S),
    io:format("Done!~n", []).

loop(S, BinPattern, StartPos, Length, Acc) ->
    case file:pread(S, StartPos, Length) of
    {ok, Bin} ->
        case Bin of
        BinPattern ->
            io:format("Found one at position: ~p.~n", [StartPos]),
            loop(S, BinPattern, StartPos + 1, Length, Acc + 1);
        _ ->
            loop(S, BinPattern, StartPos + 1, Length, Acc)
        end;
    eof ->
        io:format("I've proudly found ~p matches:)~n", [Acc])
    end.

それを実行します:

1> c(lab).
{ok,lab}
2> lab:find(<<"abc">>, "./test.txt").     
Found one at position: 43.
Found one at position: 103.
I've proudly found 2 matches:)
Done!
ok

上記のコードはあまり効率的ではなく (スキャン プロセスは一度に 1 バイトずつシフトします)、シーケンシャルです (コンピューターのすべての「コア」を利用していない) ことに注意してください。これは、開始することのみを目的としています。

于 2012-06-14T08:26:58.403 に答える