IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Fseek et offset


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 69
    Par défaut Fseek et offset
    Bonjour à tous,

    J'ai un fichier assez énorme (43Go) contenant des mots, un par ligne. Ce fichier est destiné à grandir.

    Il me faut maintenant pouvoir effectuer des recherches dans ce fichier le plus vite possible, pour cela j'avais d'abord pensé à indexer les mots selon la ligne, mais je ne trouve rien pour faire une recherche instantanée en spécifiant une ligne (sed prend un certain temps, la recherche doit se faire en quelques ms).

    Donc j'ai ensuite pensé à fseek, qui lui est instantané, mais a besoin de l'offset. J'ai donc crée un script perl pour créer un fichier contenant les références de chaque mot avec leur offset, mais l'offset prend vite beaucoup de place, et il me faut en plus stocker le nombre d'octets du mot pour le retourner (sauf si vous pensez à une autre solution, genre je fais un fseek à partir d'un offset jusqu'au prochain retour à la ligne ?).

    Mon problème est donc de stocker l'offset sur le minimum de place possible, là il atteint les 10 à 11 caractères, ce qui fait beaucoup. Mon fichier wordlist contient des mots dont la moyenne est de 10 caractères, donc il me faudrait stocker l'offset sur 9 ou moins pour gagner de l'espace.

    Auriez-vous une idée concernant le meilleur moyen d'indexer des mots dans le but de les lire avec fseek ?

    Merci, et désolé si ça n'est pas très clair

    EDIT : J'ai aussi essayé d'utiliser fwrite pour stocker le tout sous forme binaire, mais au final ça prenait plus de place. A moins que ne l'utilise mal ? Je fais un fopen en append puis j'écris avec fwrite avant de fclose.

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    un fichier texte de 43 Go ?!!???
    As-tu envisagé sérieusement de migrer le bouzin dans une base de données, je dis ça parce que cela devrait te simplifier vachement la vie.

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    43 Go ? Ca doit être bien plus que tous les mots dans toutes les langues.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 69
    Par défaut
    Bonjour, et merci pour vos réponses.

    Effectivement c'est bien plus que tous les mots de toutes les langues, c'est un fichier de passwords.

    Le problème avec une base de données "normale" c'est la taille sur le disque qui devient absolument énorme. Hors je n'ai pas beaucoup de place et j'attend que mon hébergement normale prenne fin pour passer sur un dédié. Du coup en attendant j'essaie d'optimiser le tout (et d'ailleurs je trouve ça bien plus marrant).

    Du coup pour le moment j'utilise des fichiers texte comme une database flat. En fait mon site contient une base de données permettant le reverse hashing de mots de passe. Mes "hashs" sont stockés sous la forme suivante :

    Un dossier contenant 16 sous-dossier (de '0' à 'F'). Chacun de ces sous dossier contient des fichiers txt.gz nommés de 000 à FFF. Puis à l'intérieur de ces fichiers j'ai des lignes contenant [3 premiers caractères du hash][mot en clair]. Ce qui me permet de stocker un mot sur 14 bytes pour le moment.

    Maintenant je cherche un moyen plus efficace de stocker le tout, pour pouvoir augmenter la base sans encore passer sur un dédié.

    J'avais donc discuté avec un autre webmaster de site comme le mien, qui lui avait fait un index contenant [6 premiers caractères du hash][6 caractères de l'offset], et ce pour 15 milliards de mots (je n'en ai "que" 3.7). Je ne vois vraiment pas comment il fait pour stocker son offset sur 6 caractères, à moins de bruteforcer le reste, mais ça prendrait trop de temps.

    Voilà pourquoi je cherche un moyen optimal en php (ou perl mais ça se transpose plutôt bien) pour écrire ces fichiers sous cette forme ou une autre, sans que ça prenne trop de place.

    Concernant l'écriture de fichiers binaires, je me disais que ça serait plus optimal puisqu'on peut stocker un nombre hexadécimal sur 4 bits. Toutefois étant donné que je compresse mes fichiers pour utiliser ensuite zgrep, est-ce vraiment utile ou bien la compression effectue déjà cette optimisation pour moi ? De plus je n'ai pas réussi à écrire en mode binaire avec fwrite.

    Merci à tous pour vos réponses, je ne travaille pas dans l'informatique à la base donc désolé pour mon manque de compétence.

    EDIT : Concernant le débat entre sql / flat pour les bases, j'étais d'abord en sql mais le temps de réponse ainsi que le stockage étaient vraiment trop importants. Tous ceux que j'ai croisé avec plusde 10M de mots utilisent plutôt leur propre système. Pour faire une recherche sur un mot, il me faut entre 25 et 50ms, je vais jusqu'à 500 mots en ~40s.
    Celà dit si vous avez une autre idée pour stocker autant de données sur peu de place et avec un temps de réponse acceptable je suis preneur, puisque je compte prendre un dédié.

Discussions similaires

  1. Patch modifiant l'offset d'un .exe
    Par Goshi dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 18/02/2005, 19h24
  2. Compréhension de fseek
    Par Argonz dans le forum C
    Réponses: 9
    Dernier message: 12/01/2004, 16h01
  3. Qu'est ce qu'un offset
    Par gtr dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/12/2002, 09h53
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 08h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo