2012-06-13 9 views
5

Me gusta escanear archivos binarios más grandes (> 500M) para estructuras/patrones. Soy nuevo en el lenguaje y espero que alguien pueda comenzar. En realidad, los archivos son una base de datos que contiene segmentos. Un segmento comienza con un encabezado de tamaño fijo seguido de una parte opcional de tamaño fijo seguido de la parte de carga/datos de longitud variable. Para una primera prueba, me gusta registrar la cantidad de segmentos en el archivo. Busqué en Google ya para algún tutorial pero no encontré nada que me ayudara. Necesito una pista o un tutorial que no esté muy lejos de mi caso de uso para comenzar.Escaneo de binario grande con Erlang

Saluda Stefan

+1

También ayudaría con un ejemplo del binario que está tratando de analizar y cómo debería ser el resultado final. – Lukas

Respuesta

3

que necesita para aprender acerca de Bit Syntax y Binary Comprehensions. Más enlaces útiles a seguir: http://www.erlang.org/documentation/doc-5.6/doc/programming_examples/bit_syntax.html y http://goto0.cubelogic.org/a/90.

También necesitará aprender a procesar archivos, leer archivos (línea por línea, fragmento por segmento, en posiciones determinadas en un archivo, e.t.c.), escribir en archivos de varias maneras. Las funciones de procesamiento de archivos se explican here

También puede optar por ver el código fuente de las bibliotecas de procesamiento de archivos grandes dentro de los paquetes de erlang, p. Disk Log, Dets y mnesia. Estas bibliotecas leen y escriben mucho en archivos y su código fuente está abierto para que lo vea.

espero que ayuda

1

Aquí es un problema de la muestra sintetizada: Tengo un archivo binario (test.txt) que quiera analizar. Quiero encontrar todos los patrones binarios de <<$a, $b, $c>> en el archivo.

El contenido de "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. 

Un programa de ejemplo (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 que:

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 

Tenga en cuenta que el código anterior no es muy eficiente (el proceso de escaneo se desplaza un byte a la vez) y es secuencial (no utiliza todos los "núcleos" en su computadora). Está destinado solo para que comiences.

1

Cuando sus datos se ajustan a la memoria, lo mejor que puede hacer es leer los datos en su totalidad usando file:read_file/1. Si no puede usar el archivo en el modo raw. Luego puede analizar datos usando bit_syntax. Si lo escribe de la manera correcta, puede obtener la velocidad de análisis en decenas de MB/s cuando se compila el módulo de análisis mediante HiPE. Las técnicas exactas de análisis dependen del formato de datos del segmento exacto y del resultado robusto/preciso que está buscando. Para el análisis paralelo puede inspirar por Tim Bray's Wide Finder project.

Cuestiones relacionadas