2013-02-25 2 views
0

Je n'ai pas encore reçu les détails, mais je me prépare à implémenter, en Java, un outil de recherche en ligne de commande pour rechercher dans un fichier qui contient deux champs (docid, orgid). J'ai appris que ce fichier a commencé petit et grandit tout le temps. Je dois pouvoir passer dans le docid et récupérer l'orgid.Quelle est la meilleure approche pour effectuer une recherche rapide dans un fichier grand format?

Quelqu'un peut-il me dire - quelle pourrait être la meilleure technique pour rechercher un fichier plat comme je l'ai mentionné ci-dessus? Pour l'instant, nous ne traitons que 50 000 lignes (sur deux mois) de données dans le fichier, mais elles augmenteront beaucoup plus rapidement une fois le système mis en place.

Il semble que ce soit stocké dans un système binaire que l'on peut rechercher, mais je ne suis pas sûr de ce que tout doit rechercher pour commencer.

Je pourrais vider ceci dans une base de données mais cela semble être exagéré. Plus pour ce faire, je devrais obtenir la base de données installée sur le serveur et cela va être difficile.

+2

Pourquoi cela serait-il exagéré? –

+0

Ferez-vous la recherche de temps à autre ou en tant que service censé fournir des réponses rapides à plusieurs requêtes? Dans le cas a) regardez si vous ne pouvez pas utiliser grep, egrep ou awk, dans le second cas, pensez à une base de données - car c'est exactement la raison pour laquelle les bases de données ont été inventées en premier lieu. – Ingo

+2

Je pense qu'il serait utile de fournir quelques détails supplémentaires. À quelle fréquence les choses sont-elles ajoutées et combien sont ajoutées? Une fois par jour? Quelques milliers par jour? En continu, quelques secondes chaque jour pendant la journée? Des trucs comme ça. Et puis, combien de recherches y a-t-il par jour? 10, 1000, 100000? Sont les recherches d'éléments ou de groupes uniques? Quelle taille pourrait-il avoir? Des millions? Des milliards? quelle? –

Répondre

0

Eh bien, selon sur la taille de docid et orgid et la quantité de ram que vous avez disponible à utiliser, vous pouvez simplement utiliser une table de hachage. Lisez tout dans la table de hachage, puis interrogez la table de hachage. Bien sûr, vous ne savez pas combien de recherches vous devez effectuer sur ce fichier, ni combien de fois cela doit être exécuté, et s'il doit être résident en mémoire ou pas.

D'autres options (comme suggéré précédemment) sont d'utiliser une base de données prédéfinie. Le moyen le plus efficace serait de lire le fichier dans la base de données et de tronquer le fichier afin que les lectures suivantes n'aient pas à relire les enregistrements existants. De plus, votre fichier reste gérable. Bien sûr, beaucoup de questions se posent si vous essayez de le faire. Ex: pouvez-vous tronquer le fichier? un autre processus s'attend-il à ce que le fichier existe? comment gérez-vous les conditions de course lorsque vous essayez de tronquer?

Utiliser quelque chose comme hsqldb ou h2 serait génial car ils pourraient être intégrés dans votre application et vous n'avez pas à vous soucier de les faire installer indépendamment. Bien sûr, vous devez leur fournir un espace de persistance, ou cela ne fait pas énormément d'aide.

+0

Oui, merci. J'ai fini par travailler sur les problèmes de serveur et d'aller avec hsqldb, merci pour les conseils. – user1901482

1

S'il est possible que j'irais avec l'insertion de données dans une base de données depuis le début (peut-être quelque chose de léger comme hsqldb ou h2.

Vos données se comporte comme carte, alors peut-être quelque chose comme mapdb serait mieux (mais vous avez pour vous assurer que votre schéma est peu susceptible de changer).

Si vous avez besoin d'aller avec ce fichier plat, Grep est peut-être la meilleure idée (c'est un outil rapide pour rechercher des fichiers plats)

Questions connexes