2010-09-27 20 views
6

Tengo dos preguntas con respecto al archivo E/S de Erlang; ¿cuál es la mejor manera de lograr en Erlang:Erlang File I/O: archivos binarios grandes y gzip streaming

  1. leer archivos binarios (muchos gigabytes) sin copiar todo el archivo en la memoria
  2. la lectura de un archivo binario comprimido con gzip como un flujo descomprimido

Gracias !

Respuesta

4
  1. Ver file:read/2 para bloquear el acceso secuencial y file:pread/2,3 para el acceso aleatorio.
  2. Consulte la opción compressed en file:open/2.
+0

Podría tener que descubrir algo que sea de mayor rendimiento para la producción, pero esto funciona muy bien para la creación de prototipos. – Erlang

+0

¿Has medido o simplemente has adivinado? Estoy bastante satisfecho con 'file: read/2' cuando se abre el archivo usando' [raw, binary, read_ahead] 'y usando el procesamiento orientado al bloque. ¿Qué rendimiento esperas? –

5

De acuerdo con mi experiencia, archivo: Lectura/2 solo habrá muy lenta si se llama a menudo con pequeñas cantidades de datos, a pesar de read_ahead y raw. Debe implementar un búfer binario además de eso. Si eso se entiende por procesamiento orientado a bloques, entonces estoy de acuerdo.

Estoy hablando de tiempos de ejecución de pocas horas (con archivo: lectura/2 solamente) frente a 2 minutos (con almacenamiento en búfer implementado en Erlang puro).

Éstos son mis medidas para la lectura de unos 10 bytes a la vez:

%% Bufsize vs. runtime [ns] 
%% 50  169369703 
%% 100  118288832 
%% 1000  70187233 
%% 10000  64615506 
%% 100000 65087411 
%% 1000000 64747497 

En este ejemplo, el rendimiento en realidad no aumenta con el tamaño del búfer de 10 KB, debido a la sobrecarga relativa para archivo: leer se vuelve lo suficientemente pequeño.

Cuestiones relacionadas