Forum Programmation.perl gestion de gros tableaux

Posté par  .
Étiquettes : aucune
0
25
sept.
2009
Bonjour,

J'ai besoin d'ecrire un programme qui lit un fichier texte contenant entre 50 et 500 Mo de nombre entier (sous forme texte) dans un tableau a 3 dimensions (mais je peux survivre avec une seule dimension) et ensuite faire certains calculs dessus.

La taille maximum theorique en C avec des entiers 32 bits serait a peu pres de 3-400 Mo, malheureusement, j'atteins des tailles de 9-10 Go simplement avec des tableaux 2 dimensions (trop de reference anonyme a d'autre petits tableaux ?).

J'ai essaye avec des tableaux une dimension aussi, et la taille memoire totale est toujours de 4 a 5 fois plus que la taille minimum possible (entre 1 et 2 Go contre 3-400Mo).

Je voudrais savoir si l'un d'entre vous connait un module qui permette de gerer des gros tableaux d'entiers (de l'ordre de la 100aine de million d'entrees) sans faire exploser la machine ... (et je n'ai vraiment pas envie de passer au C).
J'ai essaye Math:Matrix, mais la representation memoire des tableaux est la meme que le perl standard, je ne suis pas plus avance.




Merci d'avance,
Charlie.
  • # bd ?

    Posté par  . Évalué à 3.

    Lorsqu'on atteint les limites d'un langage (ce qui semble être ton cas) il faut soit employer des workaround (comme par exemple passé par une bd, en esperant que ca te suffit (ie utilisation de "blocs" d'entiers pour éviter de faire trop de demande) et utiliser DBI en perl etc...), soit changer de langage, soit modifier le langage.

    Quelque soit la direction que tu prend : bonne chance.

    ps : peut être que les stocker en binaire dans un fichier, et les lire avec "unpack" pourrait suffire, si c'est juste un accés séquentiel dont tu as besoin.

    pps : dans tous les cas, essayer de décomposer tes opérations en plus petits blocs ne peut qu'être bénéfique, par exemple tu pourra paralléliser beaucoup plus facilement.
    • [^] # Re: bd ?

      Posté par  (site web personnel) . Évalué à 2.

      je confirme : un petit passage par sqlite (par exemple) puis traitement en DBI/DBD perl
  • # BerkeleyDB ou fichiers

    Posté par  . Évalué à 2.

    Il a la solution de la base de données sur fichier, au vue de ton besoin, je t’orienterais plus vers une Berkeley DB (use BerkeleyDB) avec comme clé les indices du tableau plutôt que du SQLite.

    Sinon, beaucoup plus pédestre, tu stocke le tout dans un fichier et tu remplace l'accès direct à la mémoire par des accesseurs en lecture/écriture (certes moins pratiques).
    Si l'accès aux données n'est pas si aléatoire que ça, mais plutôt séquentiel, je te conseille de mapper tout ou partie du fichier en mémoire (use Sys::Mmap).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.