Le titre aurait probablement été mieux mis, mais de toute façon. Je me demandais s'il y a des fonctions pour écrire dans des fichiers qui ressemblent à ce que sont les propriétés ACID pour les bases de données. La raison est, je voudrais m'assurer que le dossier écrit que je fais ne gâchera pas et ne corrompra pas le dossier si la puissance disparaît.Toutes les fonctions d'écriture En python qui ont la même sécurité que l'ACID dans les bases de données
Répondre
Selon ce que vous faites exactement faire avec vos fichiers et la plate-forme, il y a deux options:
Si vous sérialisation d'un blob de la mémoire sur le disque de façon répétée pour maintenir l'état (par exemple: dhcp si vous êtes sur un système Posix, vous pouvez écrire vos données dans un fichier temporaire et "renommer" le fichier temporaire à votre cible. Sur les systèmes compatibles avec Posix, ceci est garanti comme une opération atomique, même si le système de fichiers est journalisé ou non. Si vous utilisez un système Windows, il existe une fonction native nommée MoveFileTransacted que vous pouvez utiliser via les liaisons. Mais le concept clé est ici, le fichier temporaire protège vos données, si le système redémarre le pire des cas, c'est que votre fichier contient la dernière bonne actualisation des données. Cette option nécessite que vous écriviez le fichier entier chaque fois que vous voulez enregistrer une modification. Dans le cas du fichier dhcp.leases, ce n'est pas un grand succès, les gros fichiers peuvent s'avérer plus lourds. Si vous lisez et écrivez constamment des bits de données, sqlite3 est la solution: il prend en charge les validations atomiques pour les groupes de requêtes et possède son propre journal interne.Une chose à surveiller ici est que commits atomiques seront plus lents en raison de la surcharge de verrouillage de la base de données, en attendant que les données de chasse, etc.
Un couple d'autres choses à considérer - si votre système de fichiers est monté en mode asynchrone, les écritures apparaîtront comme complètes car write() retourne, mais il ne sera peut-être pas encore vidé sur le disque. Renommer vous protège dans ce cas, sqlite3 aussi.
Si votre système de fichiers est monté asynchrone, il est possible d'écrire des données et de les déplacer avant que les données ne soient écrites. Donc, si vous utilisez un système Unix, il peut être plus sûr de monter la synchronisation. C'est au niveau de 'personnes pourraient mourir si cela échoue' paranoïa cependant. Mais si c'est un système embarqué et il meurt 'Je pourrais perdre mon travail si cela échoue' est également une bonne rationalisation pour la protection supplémentaire.
Le ZODB est un stockage de base de données conforme à ACID écrit en python (principalement), donc dans un sens, la réponse est oui. Mais je peux imaginer que c'est un peu exagéré :)
Soit le système d'exploitation doit fournir cela pour vous, soit vous devrez implémenter votre propre conformité ACID. Par exemple, en définissant «enregistrements» dans le fichier que vous écrivez et, lors de l'ouverture/lecture, en vérifiant quels enregistrements ont été écrits (ce qui peut signifier que vous devez jeter des données non entièrement écrites). ZODB, par exemple, implémente ceci en terminant un enregistrement en écrivant la taille de l'enregistrement lui-même; Si vous pouvez lire cette taille et qu'elle correspond, vous savez que l'enregistrement a été entièrement écrit.
Et, bien sûr, vous devez toujours ajouter des enregistrements et ne pas réécrire le fichier entier.
Il me semble que votre objectif principal est d'assurer l'intégrité des fichiers écrits en cas de coupures de courant et de pannes du système. Voici quelques éléments à prendre en compte:
- Assurez-vous que vos données sont écrites sur le disque lorsque vous fermez un fichier. Même si vous le fermez, certaines données peuvent être dans le cache du système d'exploitation pendant plusieurs secondes en attente d'être écrites sur le disque. Vous pouvez forcer l'écriture sur le disque avec f.flush(), suivi de os.fsync (f.fileno()).
- Ne modifiez pas les données existantes avant d'être certain que les données mises à jour sont en sécurité sur le disque. Cette partie peut être assez compliquée (et dépend du système d'exploitation/du système de fichiers).
- Utilisez un format de fichier qui vous aide à vérifier l'intégrité des données (par exemple, l'utilisation de sommes de contrôle).
Une autre alternative est d'utiliser sqlite3.
EDIT: Concernant mon deuxième point, je recommande fortement cette présentation: http://www.flamingspork.com/talks/2007/06/eat_my_data.odp. Cela couvre également les problèmes avec "renommer atomique".
De quel type de fichier s'agit-il? Pourriez-vous utiliser une base de données SQLite sérialisée sur disque? –
Veuillez élaborer. Quel genre de fichiers écrivez-vous et comment voulez-vous exactement que le script python fonctionne? –
duplication possible de [stockage d'état atomique en Python?] (Http://stackoverflow.com/questions/4220803/atomic-state-storage-in-python) –