à condition que nous sachions que tout le fichier sera chargé en mémoire et nous pouvons le permettre, Quels sont les inconvénients (le cas échéant) ou les limitations (le cas échéant) de chargement d'un fichier entier (éventuellement d'un fichier binaire) dans une variable Python. Si cela est techniquement possible, cela devrait-il être évité, et pourquoi?
En ce qui concerne les préoccupations de taille du fichier, à quelle taille maximale cette solution devrait être limitée?. Et pourquoi? P>
Le code de chargement réel pourrait être celui proposé dans Cette entrée Stackoverflow . p>
Le code exemple est le suivant: p> [modifier]
La manipulation de code qui vous vient à l'esprit (mais peut-être non applicable) est la liste standard des opérateurs de la liste / des cordes (supports carrés, '+' signes) ou certains opérateurs de cordes («len», «in 'opérateur», «comptent», «findien» / 'StartSwewe', 'Split', 'Traduction' ...). P> P>
6 Réponses :
En général, il y a de meilleurs moyens de le faire, mais pour les scripts uniques où vous savez que la mémoire n'est pas un problème, c'est sûr. P>
Le seul problème que vous pouvez exécuter est la consommation de mémoire: les chaînes de python sont immuables. Ainsi, lorsque vous devez modifier un octet, vous devez copier l'ancienne chaîne: Ceci nécessite jusqu'à trois fois la mémoire de Au lieu d'une chaîne, vous pouvez utiliser un Array . Celles-ci offrent beaucoup de meilleures performances si vous devez modifier le contenu et vous pouvez les créer facilement à partir d'une chaîne. P> p> ancienne p>. P>.
with open(filename, 'rb') as f:
Oui, vous pouvez-utiliser le fichier est suffisamment petit -. P>
Il est même très pythonique de convertir en outre le retour de lecture () à n'importe quel type de conteneur / de type iérien comme avec dites, string.split (), ainsi que des fonctionnalités de programmation fonctionnelle associées pour continuer à traiter le fichier "à la fois". < / p>
Pendant que vous avez eu de bonnes réponses, il semble que personne n'a répondu à cette partie de votre question (comme cela se produit souvent lorsque vous posez de nombreuses questions dans une question; -) ...: P>
concernant les préoccupations de taille de fichier, à quoi Taille maximale Cette solution devrait être limité ?. Et pourquoi? P> blockQuote>
La chose la plus importante est que la quantité de RAM physique peut-on ce processus python spécifique en réalité
utiliser strong> (ce que l'on appelle «un ensemble de travail»), sans pénaliser indûment d'autres aspects de la performance globale du système. Si vous dépassez la RAM physique de votre "jeu de travail", vous allez paginer et échanger et sortir sur le disque, et votre performance peut se dégrader rapidement (jusqu'à un état appelé "ralentissement", étaient fondamentalement tous les cycles disponibles vont à la Les tâches d'obtenir des pages de nuit et des quantités négligeables de travaux réels peuvent réellement être faites). P> Sur ce total, un montant raisonnablement modeste (dire que quelques-unes au plus, en général) va probablement être repris par Code exécutable (fichiers exécutables de Python, DLL ou .so) et par Bytecode et des données de données générales de soutien qui sont activement nécessaires en mémoire; Sur une machine moderne typique qui ne fait pas d'autres tâches importantes ou urgentes, vous pouvez presque ignorer cette surcharge par rapport aux gigaoctets de RAM que vous avez disponibles dans l'ensemble (bien que la situation puisse être différente des systèmes embarqués, etc.). P>
Tout le reste est disponible pour vos données - qui inclut ce fichier que vous lisez en mémoire, ainsi que toute autre structure de données significative. "Modifications" des données du fichier peut généralement prendre (transitairement) deux fois plus de mémoire que la taille du contenu du fichier (si vous la tenez dans une chaîne) - plus, bien sûr, si vous gardez une copie du données anciennes ainsi que de nouvelles copies / versions modifiées. p>
Donc, pour une utilisation "en lecture seule" sur une machine typique moderne 32 bits avec, par exemple, 2 Go de RAM globalement, la lecture en mémoire (selon) 1,5 Go ne devrait pas être un problème; Mais il devra être sensiblement inférieur à 1 Go si vous faites des "modifications" (et encore moins si vous avez d'autres structures de données significatives en mémoire!). Bien entendu, sur un serveur dédié avec une construction de Python 64 bits, un système d'exploitation 64 bits et 16 Go de RAM, les limites pratiques avant très différentes - à peu près proportionnellement à la quantité très différente de RAM disponible en fait. p>
Par exemple, le texte biblique du roi James 'comme téléchargeable ici (non cuillère ) est d'environ 4,4 Mo; Donc, dans une machine avec 2 Go de RAM, vous pouvez conserver environ 400 copies légèrement modifiées en mémoire (si rien d'autre ne demande de mémoire), mais dans une machine avec 16 (disponible et adressable) Go de RAM, vous pouviez Gardez bien plus de 3000 copies de telles copies. P>
Vous pouvez également utiliser la fonctionnalité V3 de Python:
>>> ''.join(open('htdocs/config.php', 'r').readlines()) "This is the first line of the file.\nSecond line of the file"
Voir mon autre commentaire, spamming Old Messages avec des réponses en double n'est pas constructive.