2010-07-23 6 views
4

Je travaille sur un robot d'indexation Web (s'il vous plaît ne pas en suggérer un existant, ce n'est pas une option). Je l'ai fonctionné comme prévu. Mon seul problème est que j'utilise actuellement une sorte de modèle serveur/client où le serveur fait l'analyse et traite les données, puis les place dans un emplacement central.java hashmap basé sur le disque

Cet emplacement est un objet créé à partir d'une classe que j'ai écrite. En interne, la classe maintient une hashmap définie comme HashMap<String, HashMap<String, String>>

je stocke des données dans la carte faisant l'URL la clé (je garde ces uniques) et la valeur de hasmap stocke les champs de données correspondant à cette URL tels que le titre, la valeur etc

Je sérialise occasionnellement les objets internes utilisés mais l'araignée est multi-threadée et dès que je dis que 5 threads rampent les exigences de mémoire augmentent exponentiellement. Jusqu'à présent, la performance a été excellente avec le hashmap, en explorant 15K urls en 2.r minutes avec environ 30 secondes de temps processeur, donc je n'ai pas vraiment besoin d'être pointé dans la direction d'une araignée existante comme la plupart des forums les utilisateurs ont suggéré. Quelqu'un peut-il suggérer une solution basée sur un disque rapide qui prendra probablement en charge la lecture simultanée &? La structure de données n'a pas à être le même, juste doit être en mesure de stocker des valeurs de balise meta liées ensemble, etc.

grâce à l'avance

+0

pourquoi exponentiellement? –

+0

parce que je l'ai testé à fond et enregistré l'utilisation de la mémoire et le temps de processeur lorsque seule la quantité de threads rampants sont augmentés. Il y avait le test étrange qui était à l'extérieur et ne correspondait pas vraiment à la corrélation montrée par d'autres tests, mais ils étaient simplement traités comme des valeurs extrêmes et ignorés quand j'ai tracé, peut ne pas être un test professionnel mais suffisant pour mon but. – zcourts

Répondre

3

Je suggère d'utiliser EhCache pour cela, même si ce que vous construisez ISN Pas vraiment un cache. EhCache vous permet de configurer l'instance de cache afin qu'elle déborde sur le stockage du disque, tout en conservant les éléments les plus récents en mémoire. Il peut également être configuré pour être persistant sur le disque, c'est-à-dire que les données sont vidées sur le disque à l'arrêt et relues en mémoire au démarrage. En plus de tout cela, c'est basé sur la valeur-clé, donc cela correspond déjà à votre modèle. Il prend en charge l'accès simultané, et puisque le stockage sur disque est géré comme un thread séparé, vous ne devriez pas avoir à vous soucier de la concurrence d'accès au disque. Alternativement, vous pouvez envisager une base de données intégrée appropriée telle que Hypersonic (ou de nombreux autres de style similaire), mais cela va probablement être plus de travail.

+0

Im regardant dans ce domaine, ehcache je veux dire. me rappelle d'Oracle Berkeley DB dans un sens ... – zcourts

+0

Je suis allé pour un db embarqué à la place, en utilisant hsqldb merci pour la suggestion tout le monde, il était très apprécié – zcourts

+1

Pour référence future à quiconque cherche quelque chose comme ça. J'ai implémenté hsqldb et hypersonique mais tous les deux provoquent une utilisation du CPU très élevée. Test d'une implémentation de sqlite, à partir de http://www.zentus.com/sqlitejdbc/ jusqu'à présent ayant de meilleurs résultats – zcourts

0

que sur l'utilisation de JPA dans votre classe, et persistance des données dans une base de données (qui peut être basé sur du texte comme sqlite) http://en.wikipedia.org/wiki/Java_Persistence_API

+1

Je suis déjà en train de sérialiser mais les objets sont de toute façon chargés sur le tas avec leur taille d'origine ce qui défait tout le point – zcourts

+0

non JPA ne concerne pas la sérialisation, il s'agit de la persistance des objets dans la base de données. Votre objet est conservé dans la base de données et non chargé (les objets java ne sont pas détruits, ils sont récupérés quand ils sont déréférencés) – fixitagain

1

Il y a Tokyo Cabinet, qui est une mise en œuvre rapide d'une table de hachage sur disque.

Dans votre cas, je pense que la meilleure façon de stocker les valeurs dans une telle configuration serait préfixe les clés de métadonnées avec l'url:

[url]_[name] => [value] 
[url]_[name2] => [value2] 

Malheureusement, je ne suis pas sûr que vous pouvez énumérer les métadonnées pour une URL donnée, en utilisant cette solution.

Si vous souhaitez utiliser un magasin de données plus structuré, il existe également MongoDB et SQLite, que je recommanderais.

+0

comme ci-dessus je cherche dans le cabinet tokyo merci pour la suggestion, je vais obtenir bk à tout le monde après je vois comment ça se passe – zcourts

1

JDBM2 La bibliothèque fournit des cartes persistantes pour Java. C'est rapide et thread-safe.

MISE À JOUR: Evolved dans MapDB projet

0

Chronicle Map est une intégrable, les données Java hachage magasin, persistant des données sur le disque (à un seul fichier), qui vise à être un remplacement sans rendez-vous de ConcurrentHashMap (fournit la même interface ConcurrentMap). Chronicle Map est the fastest store among similar solutions et offre une excellente concomitance en lecture/écriture, évoluant presque linéairement vers le nombre de cœurs disponibles dans la machine.

Avis de non-responsabilité: Je suis le développeur de Chronicle Map.