Les E/S de fichiers rapides concernent moins les appels d'API spécifiques que vous effectuez, mais plutôt la façon dont vous concevez votre application pour qu'elle fonctionne avec les E/S.
Si vous effectuez tous vos E/opérations O sur un seul thread de manière séquentielle, par exemple
- lecture de bloc dans la mémoire
- bloc de processus en mémoire d'une certaine manière
- Ecrire le bloc sur déposer
- Répétez jusqu'à ce que fait ...
vous désengorgement de la bande passante d'E/S du système dans les procès- Sing boucle d'un seul thread. Une conception alternative, mais plus compliquée consiste à multithread votre application pour maximiser le débit et éviter le temps d'attente. Cela permet au système de tirer parti à la fois de la bande passante du contrôleur de CPU et d'E/S simultanément. Une conception typique de ce ressemblerait à quelque chose comme:
- un (ou plusieurs) threads de travail lire les données à partir du disque et de les ajouter à une file d'attente d'entrée partagée
- un (ou plusieurs) threads de travail blocs de lecture de la commune file d'entrée, les traite et les ajoute à une file d'attente de sortie partagée
- Un (ou plusieurs) threads de travail lus traités bloqués à partir de la file d'attente de sortie partagée et les écrivent dans les fichiers de sortie appropriés.
Cette architecture n'est pas facile à concevoir correctement et nécessite un peu de réflexion pour éviter de créer des conflits de verrous en mémoire, ou submerger le système de demandes d'E/S simultanées. Vous devez également fournir des métadonnées de contrôle afin que l'état du traitement de sortie ne soit pas géré sur la pile d'appel d'un thread mais plutôt dans les files d'attente de travail d'entrée/sortie. Vous devez également vous assurer que vous transformez et écrivez la sortie dans le bon ordre, car avec les E/S multithread vous ne pouvez pas être sûr que le travail est placé dans la file d'attente d'entrée dans un ordre garanti. C'est compliqué - mais c'est possible, et cela peut avoir une énorme différence de débit par rapport à une approche en série.
Si vous avez vraiment le temps et que vous voulez réduire chaque once de performance du système, vous pouvez également utiliser I/O completion ports - une API relativement de bas niveau - pour optimiser le débit.
Bonne chance.
Je ne vois pas pourquoi les appels WinAPI devraient être plus rapides que les classes .NET - après tout, ces derniers utilisent l'ancien en interne. En dehors de cela, un fichier mappé en mémoire (http://en.wikipedia.org/wiki/Memory_mapped_file) serait peut-être approprié? – Noldorin
Pourquoi Dot.net aurait plus d'une façon d'écrire dans un fichier? Lire et écrire des fichiers est assez simple et cela n'a aucun sens d'avoir une forme "rapide" et "lente" - car personne n'utiliserait la version "lente" étant donné que les deux ont les mêmes objectifs. –
Dans une demi-heure, je pourrais mettre en place un test comparant les opérations de fichier .net (implémentations naïves, peut-être, qui fait partie de la question) et une application native avec IO intensive (comme QuickPAR) qui va fermer les portes .NET app. C'est le but de la question - Comment atteindre un débit de disque optimal dans .NET? – Will