Supongamos que tengo un conjunto de datos que es una matriz de 1E12 enteros de 32 bits (4 TB) almacenados en un archivo en un sistema de archivos ext4 4 TB de disco duro ..Linux: matriz int grande: mmap versus archivo de búsqueda?
consideran que los datos es más probable al azar (o al menos parece aleatorio).
// pseudo-code
for (long long i = 0; i < (1LL << 40); i++)
SetFileIntAt(i) = GetRandInt();
Además, considero que me gustaría leer elementos int individuales en un orden impredecible y que el algoritmo se ejecuta indefinidamente (está en curso).
// pseudo-code
while (true)
UseInt(GetFileInt(GetRand(1<<40)));
Estamos en Linux x86_64, gcc. Se puede suponer sistema tiene 4 GB de RAM (es decir 1000x menos de conjunto de datos)
Los siguientes son dos maneras de acceder arquitecto:
(A) mmap el archivo a un bloque de 4 TB de memoria, y acceder a ella como una int matriz
(B) abierto (2) el archivo y utilizar buscar (2) y leer (2) para leer los enteros.
Fuera de A y B que tendrá el mejor rendimiento ?, y por qué?
¿Hay algún otro diseño que proporcione un mejor rendimiento que A o B?
La velocidad para acceder a una RAM es mayor que la velocidad para acceder a HD (de algún orden de magnitud, debido a la ausencia de partes mecánicas). SI no tiene problemas de memoria, mapear todo el archivo en la RAM es la mejor solución que puede tener. También puede considerar unidades de estado sólido (que son muy similares a la RAM). Además, si el acceso aleatorio significa un acceso verdaderamente aleatorio, puede desactivar el caché para mejorar algunas actuaciones (es decir, si la probabilidad de acceder al mismo elemento es muy baja, no es útil buscar en el caché). –
@D. Cannone Mantener el caché para otro propósito cuando se hace acceso aleatorio es solo billiant, ¡gracias! – Benoit
#C se estaría cargando desde la red con algún tipo de tecnología de puente de núcleo (por ejemplo, RDMA en infiniband). Estará en algún lugar entre A y B. – bobah