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 Delphi Discussion :

Erreur E/S 131


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Canada

    Informations forums :
    Inscription : Août 2003
    Messages : 41
    Points : 31
    Points
    31
    Par défaut Erreur E/S 131
    Bonjour,

    Dans mes temps libres, je m'amuse à résoudre les problèmes mathématiques proposés par le site https://projecteuler.net/

    Dans le problème 540 (https://projecteuler.net/problem=540), il faut trouver le nombre de triangles de Pythagore pour lesquels le plus grand côté est un nombre très grand (> 10^16) et pour lesquels le PGCD des 3 côtés est égal à 1. Je sais comment générer tous ces triangles, mais le problème est que mon programme plante par manque de mémoire quand je crée le tableau dynamique pour les storer. Je suis incapable de créer un tableau dynamique de plus de 65 000 000 d'enregistrements de Record of A, B, C (3 variables Int64).

    J'ai donc essayé une solution lente de storer mes triangles dans un file of Record.

    Or, après de longues minutes à rouler, j'obtiens un message Erreur E/S 131 (Tentative de déplacement du pointeur de fichier avant le début du fichier).

    Je ne comprends pas l'origine du problème. Y a-t-il une taille maximale pour un tel fichier?

    Notez que j'ai aussi essayé d'utiliser une procédure récursive. La solution n'est pas possible (du moins, pas sur mon ordinateur), car j'ai aussi un problème de manque de mémoire étant donné l'utilisation de la pile.

    Si le fichier ne fonctionne pas, j'essayerai peut-être un multi thread. J'ai déjà fait ça une fois, je devrais être capable de recommencer.

    Merci à l'avance de votre input!

    Éric

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 710
    Points : 25 593
    Points
    25 593
    Par défaut
    file of ... c'est un Integer qui gère la position donc limité à 2Go, suffit de regarder le prototype du Seek pour le voir

    tu peux passer en TFileStream, c'est à toi de gérer comment est lu et écrit les record, c'est très facile, toujours Seek, Read, Write


    nombre très grand (> 10^16) et pour lesquels le PGCD des 3 côtés est égal à 1
    Tu vas devoir passez à un BigInt si tu veux en trouver plus
    Dire que j'étais très bon en terminal sur l'arithmétique des nombres entiers, mais pour le PGCD, euh, avec de si grand nombre, il te faut presque à chaque fois deux nombres premiers sur trois non ?
    la récursivité, ça coute vite avec une pauvre pile de 1Mo
    Tient "65 000 000 d'enregistrements de Record of A, B, C (3 variables Int64)." la théorie des 2Go c'est rare, je crois que je montais au mieux à 1700Mo (ou 1900je sais plus) ça dépend du MM utilisé (qui lui même consomme de la mémoire, en plus de windows)
    Avec un PC 64Bits, la différence en théorie c'est que tu peux avoir plusieurs tableaux de 2Go là où tu pouvais en avoir qu'un seul en 32Bits, je me suis amusé à monter à 8Go avec des GetMem, ça fonctionne.

    Tu trouves autant de triangle avec ces conditions pour avoir besoin de tant de mémoire, moi qui aurait pensé cela rare
    Pense à bufferiser, genre un array fixe de 1000 record ABC, tu l'écris cycliquement, sauf à la fin (lorsque Int64 aura explosé) où tu écris juste le bon nombre, ça donnera une accélération au programme
    Même, tu peux parallèliser le calcul et l'écriture dans un thread pour gagner encore ... par contre en multi-thread, plus tu es en a plus ça coute en mémoire, alors aucune chance que cela résolve ton problème

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Canada

    Informations forums :
    Inscription : Août 2003
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Merci Monsieur Le Troll pour la clarté de la réponse et surtout, d'avoir pris le temps!

    Je vais regarder le FileStream.

    Pour votre information, pas besoin de calculer le PGCD, on n'a qu'à appliquer la méthode expliquée ici : https://en.m.wikipedia.org/wiki/Tree...gorean_triples : on part du primitif 3 4 5 et on génère tous les autres.

    Éric

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    tu peux aussi stocker chaque noeud dans un fichier différent pour limiter le nombre d'informations

    le fichier 3.4.5 contient (5.12.13), (15.8.17),(7.24.25)
    le fichier 5.12.13 contient...

    reste à voir combien de fichiers cela génère

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Canada

    Informations forums :
    Inscription : Août 2003
    Messages : 41
    Points : 31
    Points
    31
    Par défaut
    Encore merci pour vos suggestions.

    Il faudra que je trouve une autre façon de résoudre. J'ai trouvé une approximation sur le net ... Pour le problème en question, il doit avoir environ 5 x 10^14 triangles primitifs.

    Ça m'aura au moins permis d'expérimenter les TFileStream.

    À monsieur Le Troll : 3 nombres composés peuvent être premiers entre eux (PGCD =1 ). Par exemple 6, 35 et 143 sont premiers entre eux et 6 = 2x3, 35 = 5x7 et 143 = 11x13.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur en installant Data-Dumper-2.131
    Par kenzoduf1 dans le forum Modules
    Réponses: 2
    Dernier message: 10/10/2011, 12h15
  2. Code erreur 131
    Par taket dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 29/06/2005, 16h43
  3. Réponses: 2
    Dernier message: 27/05/2002, 20h46
  4. erreur IDL:omg.org/CORBA/MARSHAL:1.0
    Par Pinggui dans le forum CORBA
    Réponses: 3
    Dernier message: 13/05/2002, 16h05
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 10h41

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