Un de mes amis a écrit ce petit PROGAM.
Le fichier TextFile code> est de 1,2 Go de taille (7 ans de journaux).
Il gère avec succès pour créer le dictionnaire, mais il ne peut pas l'écrire dans un fichier à l'aide de Pickle (Program Hors).
{
"Hello": {"World": 1, "munde": 1},
"World": {"domination": 2},
"Total": {"World": 1},
}
5 Réponses :
Pickle est seulement destiné à écrire des objets complètes (petits). Votre dictionnaire est un peu volumineux pour même tenir en mémoire, vous feriez mieux d'utiliser une base de données afin que vous puissiez stocker et récupérer des entrées une d'une à une à la fois. P>
Certains formats de base de données de fichiers singeurs faciles et faciles à utiliser, vous pouvez utiliser à partir de Python sont SQLite ou l'un des Variantes DBM . Le dernier agit comme un dictionnaire (c'est-à-dire que vous pouvez lire et écrire des paires de clé / valeur), mais utilise le disque comme stockage plutôt que 1,2 gbs de mémoire. P>
SQLite est une base de données entièrement relationnelle, tandis que Berkeley DB n'est pas, juste une clé / valeur. S'il s'agit simplement de stocker, je pense que Berkeley est une meilleure option, tandis que si vous souhaitez effectuer des questions et stocker les informations de manière plus organisée, SQLITE C'est plus approprié.
BerkeleyDB est plutôt instable et difficile à gérer, en particulier avec de plus grandes quantités de données. Même pour une seule chaîne-> String Store (qui est ce que Berkeleydb serait), j'utiliserais SQLite, qui prendrait soin de toute la gestion BerkeleyDB.
SQLite n'agit pas comme un dictionnaire.
Page Python pour le moddule BSDDB ( python.org/doc/2.6/Library/ bsddb.html ) dit qu'il est obsolète. Existe-t-il une autre option Python non obsolète pour une DB BSD?
python.org/doc/2.6/Library/persistence.html listes un certain nombre de modules de persistance de données. Le module gdbm code> semble très similaire et toujours pris en charge, j'irais pour celui-ci.
Votre suggestion de base de données était adéquate. Bien qu'il ait dû utiliser MySQL parce que SQLite ne le coupait pas.
@ Joãoportela, il serait bon de mettre à jour votre question avec pourquoi " sqlite ne le coupait tout simplement pas. I> b>" Et je me demande si une décennie plus tard SQLITE3 B > Est toujours en train de jouer au deuxième violon maintenant qu'il est utilisé dans Google Chrome et Firefox sur des plates-formes Linux.
J'aimerais, mais c'était il y a si longtemps, je ne suis plus sûr. Je pense que tout le processus (insérer et ce dernier interrogateur) a fini par être trop lent.
Avez-vous vraiment besoin de toutes les données en mémoire? Vous pouvez le diviser à des voies naïves comme un fichier pour chaque année de chaque mois si vous souhaitez que l'approche du dictionnaire / cornichon. P>
Également, rappelez-vous que les dictionnaires ne sont pas triés, vous pouvez avoir des problèmes à trier ce nombre de données. Si vous souhaitez rechercher ou trier les données, bien sûr ... p>
Quoi qu'il en soit, je pense que l'approche de la base de données a commenté avant la plus flexible, spécialement à long terme ... p>
Si votre vraiment, vraiment em> veux utiliser un dictionnaire comme la sémantique, essayez SQLalchemy's associationProxy code>. La pièce de code suivante (assez longue) traduit votre dictionnaire dans la touche , la valeur-paires em> dans les entrées
code> -Table. Je ne sais pas à quel point Sqlalchemy s'oppose à votre gros dictionnaire, mais SQLite devrait être capable de le gérer bien.
foo bar
baz quux
{u'foo': u'bar', u'baz': u'quux'}
Je pense utiliser SQLite3 à Python sur la route. Je ne sais pas quelle est la relation entre sqlalchemy code> dans votre réponse cependant.
Une solution consiste à utiliser Buzhug au lieu de cornichon. C'est une solution python python et conserve une syntaxe très pythonique. Je pense à cela comme la prochaine étape de l'étagère et de leur ILK. Il gérera les tailles de données dont vous parlez. Sa limite de taille est de 2 Go par champ (chaque champ est stocké dans un fichier séparé). P>
J'ai capturé des images à partir de http://coverartarchive.org code> et bien que lent de télécharger tant d'images,
cornichon code> n'avait aucun problème avec 155 Mo:
$ ll
total 151756
-rw-rw-r-- 1 rick rick 155208082 Oct 10 10:04 ipc.pickle
Si vous allez jouer avec de gros fichiers, pourquoi ne pas utiliser une base de données? De plus, je vois que vous faites pour boucle sur le même fichier 2 fois, cela peut être redondant et ajoute au coût de traitement. Pourquoi ne pas décrire ce que vous faites avec des exemples de fichiers d'entrée?
GhostDog74, vous voyez 2 pour les déclarations, mais il n'y a qu'une seule boucle sur le fichier :) itération sur un fichier ne fait que lire des lignes de lecture (de la position réelle), elle ne cherche pas au début du fichier.
Essayez simplement SQLITHICT (votre dict python soutenu par DB sur le disque, pas la RAM).