Je ne pense pas que vous puissiez le faire facilement dans un seul chemin d'exécution. Vous avez besoin de fsync pour que l'écriture sur le disque soit garantie - et cela va devoir attendre l'écriture.
Je suppose qu'il est possible (mais pas facile) de le faire en déléguant la tâche d'écriture à un fil ou un processus séparé. Générez les données dans votre programme existant et «écrivez-le dans le deuxième thread/processus en utilisant n'importe quelle méthode qui semble raisonnable. Cela peut être non bloquant. Le deuxième thread écrira alors toutes les nouvelles données aux données dans votre fichier de contenu, puis fsync, puis écrira le fichier d'index, puis vérifiera à nouveau les nouvelles données. Les décisions clés en matière de conception concernent la manière dont vous séparez les deux chemins d'exécution, comment vous communiquez entre eux et si vous devez reporter l'écriture au programme principal. Cela peut entraîner des problèmes de latence et de débit, mais cela fait partie du coût de la synchronisation du fichier d'index et du fichier de contenu. Au moins, il y aurait une chance de faire le travail en attendant sur le disque.
Il pourrait être utile de vérifier si cela est bien encapsulé afin de 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.
Désolé, pour une raison quelconque, SO ne m'a pas dit que j'avais une réponse, et je ne me souviens pas de la question jusqu'à maintenant. C'est une solution intéressante, je pense que je vais essayer. Cela correspond assez bien, car j'ai un pool d'assets qui doit parfois être synchronisé sur le disque, et concevoir un thread-writer pour regrouper le pool, verrouiller et cloner l'index, libérer le verrou, fsync l'asset, puis réécrire l'index, semble assez simple, merci! Je ne connais aucune base de données existante correspondant à mon utilisation. Les "objets" sont des blobs de ~ 1MB -> 15GB, nécessitant un accès de style pread(). – Rawler