2011-02-08 3 views
3

Je veux stocker un grand nombre (de centaines de millions à des centaines de milliards) de structures de hachage arbitrairement imbriquées (typiquement de 4 à 6 niveaux), avec quelques attributs au niveau supérieur. Je n'ai pas besoin d'interroger à l'intérieur du hachage imbriqué, uniquement sur les attributs de niveau supérieur. L'interrogation doit être possible sans écriture de code, généralement pour les correspondances exactes sur les attributs de niveau supérieur. Lors de la mise à jour des enregistrements, j'aimerais pouvoir mettre à jour uniquement la partie des structures de sous-hachage qui ont changé et ne pas avoir à lire/écrire l'ensemble de l'enregistrement. Le db doit avoir des liaisons/pilotes pour C, Ruby et Python.Quelle base de données dois-je utiliser pour stocker un grand nombre de structures de hachage imbriquées potentiellement volumineuses?

Mongodb semble être idéal, sauf qu'il y a une limite de 4 Mo (et bientôt de 8 Mo ou 16 Mo) pour chaque article. La plupart de ces éléments seront petits, mais certains d'entre eux peuvent être de 100 à 200 Mo et potentiellement plus volumineux.

Existe-t-il une autre base de données correspondant à ces critères?

+0

Pouvez-vous fournir un échantillon de à quoi pourrait ressembler cette structure de hachage? –

+0

Non, mais je pourrais être en mesure de vous donner quelque chose de similaire. Qu'est-ce que vous voulez savoir précisément? – fields

Répondre

0

Redis ne répond pas à la plupart de vos exigences, mais pourrait si vous êtes prêt à construire quelque chose sur le dessus.

Deux éléments clés manquent. Tout d'abord, Redis ne prend pas en charge les hachages imbriqués. Mais si vous êtes prêt à utiliser une sorte d'encodage, une valeur peut pointer vers une clé avec un autre hachage. Cela permettrait des structures imbriquées arbitraires. Avec ce hack, les mises à jour ont seulement besoin de mettre à jour la partie qui a changé. Vous devez écrire cette couche dans C, Ruby et Python. Mais ce serait assez simple.

Deuxièmement, il n'y a pas d'interface qui vous permet de l'interroger sans écrire de code. Mais cela devrait être assez facile à écrire. Et vous avez seulement besoin de l'écrire une fois.

+0

Si je vais écrire une couche pour stocker des sous-hachages dans des enregistrements séparés, je pourrais tout aussi bien le faire pour mongodb. Cependant, je m'inquiéterais des performances de lecture lors du réassemblage de grandes structures, ce qui ferait exploser le nombre d'éléments/lignes de la table cible de quelques ordres de grandeur. – fields

+0

@fields: Oui, vous pouvez le faire pour mongodb. La performance avec Redis est probablement meilleure que celle de mongodb, mais je suis d'accord avec vous sur le fait que les performances en lecture pourraient être un problème. Et oui, cela ferait exploser le nombre d'objets. – btilly

+0

En utilisant redis, comment interrogez-vous un item/row par plus d'un attribut?Tout ce que j'ai vu dans la documentation et utilisé a des éléments référencés par une seule clé. – fields

0

Vous pouvez effectuer un post-traitement. Vous devrez donner des noms séparés pour les clés 'id' à l'intérieur de vos sous-états, mais si vous faites cela, quelque chose comme ça devrait fonctionner ... jusqu'à présent, tout va bien:

étant donné un hachage stocké comme si:

x => #<Company id: 16, name: "JRapid", markets: {"markets"=>"[{:market_id=>12, :market_name=>\"enterprise software\", :parents=>[{:parent_id=>12, :name=>\"enterprise software\", :grandparents=>{:parent_id=>12, :name=>\"enterprise software\"}}]}, {:market_id=>38, :market_name=>\"cloud computing\", :parents=>[{:parent_id=>38, :name=>\"cloud computing\", :grandparents=>{:parent_id=>38, :name=>\"cloud computing\"}}]}, {:market_id=>409, :market_name=>\"development platforms\", :parents=>[{:parent_id=>409, :name=>\"development platforms\", :grandparents=>{:parent_id=>409, :name=>\"development platforms\"}}]}, {:market_id=>1132, :market_name=>\"developer tools\", :parents=>[{}]}]"}, locations: {"locations"=>"[{:location_id=>1624, :location_name=>\"california\", :parents=>[{}]}, {:location_id=>1703, :location_name=>\"sunnyvale\", :parents=>[{}]}]"}, follower_count: 8, high_concept: "Rapid development Java cloud platform", product_desc: "JRapid is a Platform as a Service and is the fastes...", urls: {"blog_url"=>"http://www.jrapid.com/blog", "logo_url"=>"https://angel.co/images/icons/startup-nopic.png", "thumb_url"=>"https://angel.co/images/icons/startup-nopic.png", "company_url"=>"http://www.jrapid.com", "twitter_url"=>"http://www.twitter.com/JRapid", "angellist_url"=>"https://angel.co/jrapid"}, status: nil, created_at_or_updated_at: {"created_at"=>"2010-07-21T18:48:32Z", "updated_at"=>"2011-05-07T20:00:37Z"}, screenshots: {"screenshots"=>"[[nil]]"}, created_at: "2012-08-07 05:37:54", updated_at: "2012-08-07 05:37:54"> 

Vous pouvez faire quelque chose comme ceci:

x = x.locations 
x = x['locations'] 
x = eval(x) 
x[0][:id] 
#=> 1624 

AVERTISSEMENT: eval en cours d'exécution() sur une chaîne donnée prendra à peu près tout. Donc, cela pourrait ne pas être une solution de "mode de production". En fait ce n'est pas le cas. Mais cela fonctionnera provisoirement jusqu'à ce que vous appreniez à utiliser une vraie solution de DB de document. ENCORE: AVERTISSEMENT! L'exécution d'eval peut être dangereuse!

(si cela vous a aidé, s'il vous plaît marquer un point --- Je suis interdit de SO pour poser trop de questions et ont besoin plus de points de REP pour pouvoir poser des questions à nouveau)

Questions connexes