Question

Dans mon programme, je tiens deux fichiers ouverts pour l'écriture, un fichier de contenu, contenant des morceaux de données, et un fichier d'index, contenant une carte sur laquelle des morceaux de données ont été écrites à ce jour.

Je voudrais les rincer à la fois sur le disque, aussi performant que possible, avec la seule contrainte que les blocs dans les données fichier doit être écrit avant que les blocs correspondants dans la carte fichier (naturellement).

Le hic est que je voudrais éviter de bloquer I.E. faire un fsync, à la fois pour la latence et le débit-raisons.

Toutes les idées?

Était-ce utile?

La solution

Je ne pense pas que vous pouvez le faire facilement en un seul chemin d'exécution. Vous avez besoin fsync d'avoir l'écriture sur le disque garantie - et cela va devoir attendre l'écriture.

Je suppose qu'il est possible (mais pas facile) à faire en déléguer la tâche d'écriture à un thread séparé ou d'un processus. Générer les données dans votre programme existant et « écrire » au second fil / processus en utilisant une méthode qui ressemble sensible. Cela peut être non-blocage. Le deuxième fil alors écrire de nouvelles données aux données de votre fichier de contenu, puis fsync, puis écrire le fichier d'index, puis vérifier les nouvelles données à nouveau. les décisions de conception clés concernent la façon dont vous séparer les deux chemins d'exécution, la façon dont vous communiquer entre eux, et si vous avez besoin de signaler le dos d'écriture au programme principal. Cela pourrait avoir encore la latence et le débit des problèmes, mais cela fait partie du coût de choisir d'avoir le fichier d'index et fichier de contenu synchronisé. Au moins il y aurait une chance d'obtenir le travail effectué en attendant sur le disque.

Il pourrait être intéressant de regarder pour voir si cela est bien encapsulé de manière à vous être utile dans la source de l'une des bases de données transactionnelles. Vous pouvez également étudier l'option de synchronisation lorsque vous montez le système de fichiers pour le fichier de contenu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top