Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/03/2014, à 10:55

Smocrate

Chercher des points dans une liste (KDTree)

Bonjour,

J'ai un fichier (de environ 18 millions de lignes) de coordonnées X,Y,Z. Je cherche à trouver les points les plus proches de cette base par rapport à une entré X,Y.
J'ai fais un script en PYTHON 2.7 qui utilise les les librairies (spatial pour kdtree) et numpy mais quand je créé ma liste j'ai une erreur mémoire (la RAM de mon PC n'est pas saturé au moment de l'erreur)

bd_alti = np.loadtxt("BASE_ALTI.xyz", delimiter=",", dtype=float, usecols=(0,1))

Traceback (most recent call last):
  File "script_kdtree.py", line 7, in <module>
    bd_alti = np.loadtxt("BASE_ALTI.xyz", delimiter=",", dtype=float, usecols=(0,1))
  File "c:\Python27\lib\site-packages\numpy\lib\npyio.py", line 844, in loadtxt
    X.append(items)
MemoryError

Avez-vous une idée pour faire ce que je veux faire ?

Dernière modification par Smocrate (Le 06/03/2014, à 10:55)

Hors ligne

#2 Le 06/03/2014, à 11:22

claudius01

Re : Chercher des points dans une liste (KDTree)

Bonjour,

Bien que tu penses que "la RAM de mon PC n'est pas saturé au moment de l'erreur", je pense au contraire que cela ressemble à un Out of Memory ;-)
Question: Quelle est la taille moyenne de chacune des 18 millions de lignes ?
Proposition: Mettre des traces de progression avec l'état d'occupation de la mémoire. Cela confirmera/infirmera mon propos.


Cordialement, A+
--
Claudius

Hors ligne

#3 Le 06/03/2014, à 12:33

Smocrate

Re : Chercher des points dans une liste (KDTree)

Je regarde la RAM avec le gestionnaire des taches Windows (désolé je suis sous windows :x)
Quand j'exécute le script je vois la mémoire augmenter progressivement et quand il sort l'erreur elle n'est même pas à la moitié.

Hors ligne

#4 Le 06/03/2014, à 13:14

claudius01

Re : Chercher des points dans une liste (KDTree)

Smocrate a écrit :

... désolé je suis sous windows :x

Je ne connais pas windows (du moins ses méandres et cuisines internes ;-)
Ok, il y a peut-être une limite, d'où ma précédente question à laquelle je rajoute:
Question 2: L’application tourne t'elle en 32 ou 64 bits ?

Proposition 2: Limiter le nombre de lignes à analyser par réduction dichotomique jusqu'à ce que cela passe sans erreur.
Proposition 3: Tracer les dernières lignes analysées pour voir si l'erreur ne serait pas liée à leur contenu ;-(

Dernière modification par claudius01 (Le 06/03/2014, à 13:15)

Hors ligne

#5 Le 06/03/2014, à 14:19

psyphi

Re : Chercher des points dans une liste (KDTree)

Je pense que la RAM disponible pour Python (tout comme pour la machine virtuelle Java) est limitée par défaut. Par contre je ne sais pas comment changer cette valeur.
Néanmoins tu as un problème de conception dans ton code. Il ne faut pas charger les 18 millions de de ligne en une seule dans ton programme. Il faut y aller par étapes. Par exemple, lire 1000 lignes, comparer avec la valeur d'entrée, garder la plus proche, relire 1000 lignes, comparer avec la valeur qui était la plus proche dans l'étape précédente etc...

Hors ligne

#6 Le 06/03/2014, à 15:51

Smocrate

Re : Chercher des points dans une liste (KDTree)

Je viens de limiter le nombre de lignes a analyser et ça fonctionne.
Plus de messages d'erreurs ^^ par contre c'est long...

Merci smile

Dernière modification par Smocrate (Le 06/03/2014, à 15:51)

Hors ligne

#7 Le 06/03/2014, à 18:16

psyphi

Re : Chercher des points dans une liste (KDTree)

C'est normal que ce soit lent, essaye de jouer un peu sur les paramètres, par exemple en lisant par blocs de 10 000 ou 100 000 lignes.
Si tu veux accélérer le traitement tu peux lancer deux ou quatre threads  qui traitent chacun en parallèle 1000 lignes du fichier. Par contre l'effort et la difficulté de la mise en place d'un tel système est beaucoup plus complexe. Effectivement les threads devant communiquer entre eux pour savoir quels sont les blocs de 1000 lignes restant à traiter et lequel à la valeur la plus proche de l'entrée utilisateur. Bref quelques heures de programmation en plus, mais l'occasion de s'intéresser aux threads et à leur fonctionnement. Si tu travailles en python3 avec des processeurs multi-coeur alors tu peux même utiliser deux processus différents qui tourneront chacun sur un coeur différent, ce sera encore plus rapide que les threads.

Hors ligne

#8 Le 06/03/2014, à 19:12

fabkzo

Re : Chercher des points dans une liste (KDTree)

Salut,

Juste une question @smocrate:

tu ne peux pas faire une extraction avec gdal de la portion visée de ta bd_alti afin de limiter le temps de travail?


pinterest ==> fabkzo!
Python beginner on Rpi
http://www.fabkzo.com

Hors ligne