Bonjour à tous,
Je sais qu'il existe plusieurs façons de sauvegarder une liste, mais lorsque que cette liste est de très grande taille et que l'on doit la charger en mémoire, quelle est la plus rapide ?
Merci pour vos réponses
Bonjour à tous,
Je sais qu'il existe plusieurs façons de sauvegarder une liste, mais lorsque que cette liste est de très grande taille et que l'on doit la charger en mémoire, quelle est la plus rapide ?
Merci pour vos réponses
Plus de détails S.V.P.
La façon la plus commune d'avoir une "liste" de très longue taille (voire infinie) en Python est d'utiliser un itérateur.
Je suis débutant et je ne comprends pas trop le sens d'itérateur.
J'ai trouvé une explication sur Wikipedia http://fr.wikipedia.org/wiki/It%C3%A9rateur), mais si tu pouvais me montrer un exemple, ça serait vraiment sympa.
Ma liste est une liste de nombres premiers pour l'instant elle est petite (10^6)mais j'aimerais l'étendre à tous ceux inférieurs à 10^9.
Pour les conserver en tout temps en mémoire, ça va prendre énormément de mémoire. Si tu veux limiter ça, il faudrait que tu trouves une façon alternative de solutionner ton problème ou utiliser quelque chose genre une base de données SQLite pour éviter de tout garder en mémoire.
Exemple de mise en mémoire avec SQLITE
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #!/usr/bin/env python # -*- coding: iso-8859-1 -*- # import de SQLITE import sqlite3,os,os.path if os.path.exists('prem.db') : os.remove('prem.db') # J'efface l'ancien pour les essais connection = sqlite3.connect('prem.db') #Création d'un objet connection à la BDD, connection ou création si pas d'existence cursor = connection.cursor() #Création de l'objet curseur # Création de la table cursor.execute('CREATE TABLE premTable (id INTEGER PRIMARY KEY,nombre INTEGER)') # Entrée directe d'enregistrement cursor.execute('INSERT INTO premTable VALUES (null, 1)') # Entrée indirecte d'enregistrement for i in [3,5,7,9,11]: cursor.execute('INSERT INTO premTable VALUES (null,'+str(i)+")") # Ou on peux faire normalement un truc comme ceci # cursor.execute('INSERT INTO premTable VALUES (null,?)',i) connection.commit() # Affichage des enregistrements print print print "Parcours direct du curseur avec une boucle for" cursor.execute('SELECT * FROM premTable') for row in cursor : for r in row: print r, print print cursor.close() connection.close()
Je ne connais pas ton projet, mais à mon sens, c'est dans une base de données. Une fois que tu l'as rentré, c'est facile de travailler avec.
Enfin, c'est selon ce que tu entends par liste de très grande taille et ce que tu veux en faire. Ensuite, la plus rapide à monter en mémoire n'as pas de sens, car si tu veux cette liste en mémoire, c'est que tu veux l'utiliser. Je pense qu'il faut aussi te poser la question de savoir comment tu veux travailler avec cette masse de données.
Si j'ai bien compté, il y a 50 847 534 nombres premiers avant 10^9. Ca ne me semble pas si inaccessible que ça de travailler avec, même s'il vaut mieux ne pas vouloir trop dupliquer la liste !
Est-ce que tu utilises les listes de Python ?
sinon, comme tous tes nombres sont des entiers, utilisent les tableaux de numpy. La mémoire utilisée devrait être beaucoup plus faible.
Pour l'instant, j'ai fait des essais avec des listes python.
En fait, j'ai plusieurs listes que je vais regrouper en une.
En ce moment, j'essais de migrer sous ubuntu et j'ai quelques problèmes de drivers, mais dès que je peux, je ferais des essais avec tout ce que vous m'avez proposé.
Merci à tous
Partager