Necesito leer el contenido de varios miles de archivos pequeños al inicio. En Linux, solo usar fopen y leer es muy rápido. En Windows, esto sucede muy lentamente.Cómo crear CreateFile lo más rápido posible
He cambiado al uso de E/S superpuestas (E/S asíncrona) usando ReadFileEx, donde Windows hace una devolución de llamada cuando los datos están listos para leer.
Sin embargo, los miles reales de llamadas a CreateFile en sí siguen siendo un cuello de botella. Tenga en cuenta que proporciono mis propios búferes, enciendo el indicador NO_BUFFERING, le doy la sugerencia de SERIAL, etc. Sin embargo, las llamadas a CreateFile toman varios 10 segundos, mientras que en Linux todo se hace mucho más rápido.
¿Hay algo que se pueda hacer para que estos archivos estén listos para leer más rápido?
La llamada a CreateFile es:
hFile = CreateFile(szFullFileName,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
Es posible que el cuello de botella sea el sistema de archivos, ¿es posible usar un archivo plano en lugar de leer miles de archivos pequeños? – tenfour
Windows es notoriamente malo al tratar con una gran cantidad de archivos en un directorio, si ese es tu caso. ¿Es multithreading la cosa una opción, por lo que tendrá 10 hilos haciendo las lecturas en concur? – eran
Debería echarle un vistazo a esta pregunta http://stackoverflow.com/questions/197162/ntfs-performance-and-large-volumes-of-files-and-directories –