Dans mon programme, je télécharge des articles sur le net en masse. Les articles en question ont chacun un DOI, une sorte d'id unique (c'est une string). Ce n'est pas moi qui le définis, il vient avec l'article. Une fois l'article dl, j'en extrais certaines informations, que je mets en base de donnée (sqlite).
Quand je relance le programme, je récupère le DOI pour chaque article, et si le DOI est déjà en base de donnée, je ne retélécharge pas l'article, et je ne refais pas les traitements.
Seulement voilà, pour vérifier que le DOI n'est pas déjà en base de donnée, je fais ça: au début du programme, je fais une seule requête SQL, et je construis une liste avec tous les DOI déjà présents en bdd. Une grosse liste. J'ai plus de 20000 items dans ma bdd, donc ça fait une liste de plus de 20000 éléments.
De plus, je construis une liste de booléens, de même taille que la liste des DOI, pour faire d'autres vérifications.
J'ai benchmarké mon programme avec memory_profiler, qui me dit que cette liste + la liste de booléens prend environ 500 Mo en RAM. C'est beaucoup, beaucoup trop. Je dois trouver quelque chose de plus économe.
Donc ma question, qu'est ce qu'il vaut mieux faire:
- construire les 2 grosses listes comme je fais, et sacrifier 500 Mo de mémoire, et à chaque DOI, vérifier si la liste le contient
- faire une requête SQL à chaque fois que je veux vérifier le DOI
Voilà, j'aurais besoin de vos avis, je voudrais connaître les avantages et les inconvénients des 2 méthodes.