Si estás leyendo 100.000 estructuras en principio, a pocos bytes que tenga esa estructura, habrás consumido los 20Mb. en un parpadeo. Entonces me pregunto si estás obteniendo y consultando el retorno de fread, si no devuelve la misma cantidad de bytes que se intenta leer, o se llegó al final de fichero o hay un error.
Cuando hay un error se genera un reporte, como estás en un bucle y no lo tratas (es un a dedución a falta de un código más explícito), básicamente estás generando reportes de error, constantemente que por sí mismo podrían explicar la caída del rendimiento.
Si no es esto, deberías poner aunque sea un ejemplo práctico que reproduzca el error, no necesariamente todo tu código, basta simplificado para que pueda reproducirs el error e investigarlo un poco más a fondo.
Cuando hay un error se genera un reporte, como estás en un bucle y no lo tratas (es un a dedución a falta de un código más explícito), básicamente estás generando reportes de error, constantemente que por sí mismo podrían explicar la caída del rendimiento.
Si no es esto, deberías poner aunque sea un ejemplo práctico que reproduzca el error, no necesariamente todo tu código, basta simplificado para que pueda reproducirs el error e investigarlo un poco más a fondo.