2012-06-13 11 views
5

Tôi thích quét các tệp nhị phân lớn hơn (> 500M) cho cấu trúc/mẫu. Tôi là người mới với ngôn ngữ, hy vọng rằng ai đó có thể cho tôi bắt đầu. Trên thực tế các tệp là một cơ sở dữ liệu chứa Phân đoạn. Phân đoạn bắt đầu với tiêu đề có kích thước cố định, theo sau là phần tùy chọn có kích thước cố định, sau phần tải trọng/dữ liệu có chiều dài thay đổi. Đối với một thử nghiệm đầu tiên tôi chỉ muốn đăng nhập số lượng các phân đoạn trong tập tin. Tôi googled đã cho một số hướng dẫn nhưng không tìm thấy gì giúp. Tôi cần gợi ý hoặc hướng dẫn không quá xa trường hợp sử dụng của tôi để bắt đầu.Quét nhị phân lớn với Erlang

Greets Stefan

+1

Nó cũng sẽ giúp một ví dụ về nhị phân bạn đang cố gắng phân tích cú pháp và kết quả cuối cùng sẽ trông như thế nào. – Lukas

Trả lời

3

bạn cần phải tìm hiểu về Bit SyntaxBinary Comprehensions. Các liên kết hữu ích hơn để theo dõi: http://www.erlang.org/documentation/doc-5.6/doc/programming_examples/bit_syntax.htmlhttp://goto0.cubelogic.org/a/90.

Bạn cũng sẽ cần tìm hiểu cách xử lý tệp, đọc từ tệp (từng dòng, từng đoạn một, tại các vị trí nhất định trong tệp, e.t.c.), ghi vào tệp bằng nhiều cách. Các hàm xử lý tệp được giải thích here

Bạn cũng có thể chọn xem mã nguồn của các thư viện xử lý tệp lớn trong các gói erlang ví dụ: Disk Log, Detsmnesia. Các thư viện này đọc và viết rất nhiều vào các tệp và mã nguồn của chúng mở để bạn xem.

Tôi hy vọng rằng sẽ giúp

1

Đây là một bài toán mẫu tổng hợp: Tôi có một tập tin nhị phân (test.txt) mà tôi muốn phân tích. Tôi muốn tìm tất cả các mẫu nhị phân của <<$a, $b, $c>> trong tệp.

Nội dung của "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. 

Một chương trình mẫu (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. 

Run nó:

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 

Lưu ý rằng đoạn mã trên không hiệu quả lắm (quá trình quét thay đổi một byte tại một thời điểm) và nó là tuần tự (không sử dụng tất cả các "lõi" trên máy tính của bạn). Nó có nghĩa là chỉ để giúp bạn bắt đầu.

1

Khi dữ liệu của bạn phù hợp với bộ nhớ, điều tốt nhất bạn có thể làm là đọc toàn bộ dữ liệu bằng cách sử dụng file:read_file/1. Nếu bạn không thể sử dụng tệp ở chế độ raw. Sau đó, bạn có thể phân tích dữ liệu bằng bit_syntax. Nếu bạn viết nó đúng cách, bạn có thể đạt được tốc độ phân tích trong hàng chục MB/s khi phân tích mô-đun được biên dịch bằng cách sử dụng HiPE. Các kỹ thuật phân tích chính xác tùy thuộc vào định dạng dữ liệu phân đoạn chính xác và kết quả chính xác/mạnh mẽ mà bạn đang tìm kiếm. Để phân tích cú pháp song song, bạn có thể truyền cảm hứng cho Tim Bray's Wide Finder project.