2010-05-05 1 views
1

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 blocs de données ont été écrits jusqu'à présent. Je voudrais les vider tous les deux sur disque, aussi performant que possible, avec la seule contrainte que les blocs dans le fichier de données doivent être écrits avant les blocs correspondants dans le fichier map (naturellement). Le problème est que je voudrais éviter de bloquer I.E. faire un fsync, à la fois pour des raisons de latence et de débit.Existe-t-il une méthode posix pour s'assurer que deux fichiers sont vidés en séquence sans blocage?

Des idées?

Répondre

1

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.

+0

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

Questions connexes