2010-10-24 22 views
0

Je travaille sur un projet qui surveille essentiellement un ensemble de répertoires distants (FTP, chemins en réseau, et autres), si le fichier est considéré comme nouveau et répond aux critères que nous le téléchargeons et le traitons. Cependant, je suis coincé sur la meilleure façon de garder une trace des fichiers que nous avons déjà téléchargés. Je ne veux pas télécharger de fichiers en double, donc je dois garder une trace de ce qui est déjà téléchargé.Persistance des données pour python quand beaucoup de recherches mais peu écrit?

i stockait réservation initiale comme un arbre:

server->directory->file_name 

Lorsque le service arrête il écrit dans un fichier, et relit en arrière quand il démarre. Cependant, étant donné qu'il y a environ 20 000 fichiers dans l'arborescence, cela ralentit beaucoup.

Y a-t-il une meilleure façon de procéder?

EDIT

Les temps recherche commencent à beaucoup de ralentissement, ma mise en œuvre de base est un dict d'un dict. Le matériel de stockage sur le disque est bien, c'est plus ou moins juste le temps de recherche. Je sais que je peux optimiser l'arbre et le partitionner. Cependant, cela semble excessif pour un si petit projet, j'espérais que python aurait quelque chose comme ça.

+1

Que diriez-vous d'utiliser un 'dict' de' dict' et d'utiliser 'pickle' pour sérialiser/désérialiser les données sur le disque? Avez-vous essayé cette option? –

+0

c'est ce que je fais à peu près, mais la dict du dict commence à ralentir après un certain point. Quand il y a beaucoup de fichiers stockés. – UberJumper

+1

Pourquoi ne pas utiliser une base de données Embedded SQL comme sqlite? Python a des bibliothèques pour cela. –

Répondre

1

Je créerais un ensemble de tuples, puis je le ferais dans un fichier. Les tuples seraient (server, directory, file_name), ou même simplement (server, full_file_name_including_directory). Il n'y a pas besoin d'une structure de données à plusieurs niveaux. Les tuples vont entrer dans l'ensemble et vous donner une recherche O (1). Vous mentionnez «les choses commencent à ralentir beaucoup», mais vous ne dites pas si c'est la lecture et l'écriture, ou si les temps de recherche ralentissent. Si vos temps de recherche ralentissent, vous pouvez être en train de paginer. Votre structure de données approche-t-elle une fraction significative de votre mémoire physique?

Une façon de récupérer de la mémoire est de intern() les noms de serveur. De cette façon, chaque nom de serveur ne sera stocké qu'une seule fois en mémoire.

Une alternative intéressante est d'utiliser un filtre Bloom. Cela vous permettra d'utiliser beaucoup moins de mémoire, mais téléchargera occasionnellement un fichier que vous n'auriez pas dû. Cela pourrait être un compromis raisonnable, en fonction de la raison pour laquelle vous n'avez pas voulu télécharger le fichier deux fois.

+0

il ralentit pendant la recherche désolé j'ai corrigé la question. – UberJumper

+0

Avoir 'server' dans chaque tuple ne vous donnerait pas la capacité du dict-dict d'avoir un aperçu rapide sur tous les serveurs et leurs fichiers respectifs. Imaginez que vous voulez vous connecter une fois à un serveur et manipuler tous ses fichiers ... – eumiro

+0

@eumiro, je ne vais pas imaginer de nouvelles exigences. Le PO a dit qu'il a besoin de suivre les doublons. –