Je me suis demandé ... Si je lis, disons, un fichier csv de 400 Mo dans un dataframe pandas (en utilisant read_csv ou read_table), y a-t-il un moyen d'estimer la quantité de mémoire dont il aura besoin? J'essaie simplement d'avoir une meilleure idée des trames de données et de la mémoire ...
126
top
puisShift + M
de trier mon utilisation de la mémoire.x=df.loc[[]]
prend0.1
quelques secondes à être calculé (pour extraire zéro ligne) et, en outre, prend des centaines de mégaoctets de mémoire, tout comme la trame de données d'origine, probablement à cause d'une copie en dessous.Réponses:
df.memory_usage()
renverra combien chaque colonne occupe:Pour inclure des index, passez
index=True
.Donc, pour obtenir la consommation globale de mémoire:
En outre, le passage
deep=True
permettra un rapport d'utilisation de la mémoire plus précis, qui rend compte de l'utilisation complète des objets contenus.Cela est dû au fait que l'utilisation de la mémoire n'inclut pas la mémoire consommée par des éléments qui ne sont pas des composants du tableau if
deep=False
(cas par défaut).la source
deep=True
deep=True
memory_usage()
renvoie l'utilisation de la mémoire en octets (comme vous vous en doutez).Voici une comparaison des différentes méthodes -
sys.getsizeof(df)
c'est le plus simple.Pour cet exemple,
df
est un dataframe avec 814 lignes, 11 colonnes (2 pouces, 9 objets) - lu à partir d'un fichier de formes de 427 Kosys.getsizeof (df)
df.memory_usage ()
df.info ()
Imprime les informations de la trame de données sur stdout. Techniquement, ce sont des kibioctets (Kio), pas des kilo-octets - comme le dit la docstring, "l'utilisation de la mémoire est indiquée en unités lisibles par l'homme (représentation en base 2)." Donc, obtenir des octets serait multiplié par 1024, par exemple 451,6 Kio = 462 438 octets.
la source
g
code ci-dessus fait-il référence?df.info(memory_usage="deep")
, il renvoie "392,6 Mo", alorssys.getsizeof(df)
que lesdf.memory_usage(index=True, deep=True).sum()
deux renvoient environ "411718016" (~ 411 Mo). Pouvez-vous expliquer pourquoi les 3 résultats ne sont pas cohérents? mercidf.memory_usage(deep=True).sum()
renvoie presque la même chose avecdf.memory_usage(index=True, deep=True).sum()
. dans mon cas, le neindex
prend pas beaucoup de mémoire. Chose intéressante, j'ai trouvé cela411718016/1024/1024 = 392.6
, doncdf.info(memory_usage="deep")
peut-être utilisé2^10
pour convertir des octets en Mo , ce qui me rend confus. Merci pour votre aide quand même: D.df.info
renvoie des mégaoctets (2 ^ 10), pas des mégaoctets (10 ^ 6) - modifiera la réponse.J'ai pensé que j'apporterais plus de données à la discussion.
J'ai effectué une série de tests sur ce problème.
En utilisant le
resource
package python , j'ai obtenu l'utilisation de la mémoire de mon processus.Et en écrivant le csv dans un
StringIO
tampon, je pourrais facilement en mesurer la taille en octets.J'ai mené deux expériences, chacune créant 20 dataframes de tailles croissantes entre 10 000 lignes et 1 000 000 lignes. Les deux ayant 10 colonnes.
Dans la première expérience, j'ai utilisé uniquement des flottants dans mon ensemble de données.
C'est ainsi que la mémoire a augmenté par rapport au fichier csv en fonction du nombre de lignes. (Taille en mégaoctets)
La deuxième expérience, j'ai eu la même approche, mais les données de l'ensemble de données ne consistaient que de courtes chaînes.
Il semble que la relation entre la taille du csv et la taille de la trame de données peut varier beaucoup, mais la taille en mémoire sera toujours plus grande d'un facteur 2-3 (pour les tailles de trame de cette expérience)
J'aimerais compléter cette réponse avec plus d'expériences, veuillez commenter si vous voulez que j'essaye quelque chose de spécial.
la source
Vous devez le faire à l'envers.
Techniquement, la mémoire est à ce sujet (qui comprend les index)
Donc 168 Mo en mémoire avec un fichier de 400 Mo, 1M lignes de 20 colonnes flottantes
BEAUCOUP plus compact lorsqu'il est écrit sous forme de fichier binaire HDF5
Les données étaient aléatoires, donc la compression n'aide pas trop
la source
read_csv
?iotop
liketop
/htop
pour regarder (en temps réel) les performances d'E / S.nbytes
sera une sous-estimation grossière si vous avez par exemple des chaînes dans un dataframe.Si vous connaissez les
dtype
s de votre tableau, vous pouvez directement calculer le nombre d'octets qu'il faudra pour stocker vos données + certains pour les objets Python eux-mêmes. Un attribut utile desnumpy
tableaux estnbytes
. Vous pouvez obtenir le nombre d'octets des tableaux d'un pandasDataFrame
en faisantobject
Les tableaux dtype stockent 8 octets par objet (les tableaux d'objet dtype stockent un pointeur vers un opaquePyObject
), donc si vous avez des chaînes dans votre csv, vous devez prendre en compte ceread_csv
qui les transformera enobject
tableaux dtype et ajuster vos calculs en conséquence.ÉDITER:
Consultez la
numpy
page des types scalaires pour plus de détails sur leobject
dtype
. Comme seule une référence est stockée, vous devez également prendre en compte la taille de l'objet dans le tableau. Comme le dit cette page, les tableaux d'objets sont quelque peu similaires auxlist
objets Python .la source
Oui il y a. Pandas stockera vos données dans des
ndarray
structures numpy à 2 dimensions en les regroupant par dtypes.ndarray
est fondamentalement un tableau de données C brut avec un petit en-tête. Vous pouvez donc estimer sa taille simplement en multipliant la taille de celuidtype
qu'il contient par les dimensions du tableau.Par exemple: si vous avez 1000 lignes avec 2
np.int32
et 5np.float64
colonnes, votre DataFrame aura unnp.int32
tableau 2x1000 et un 5x1000np.float64
tableau qui est:4 octets * 2 * 1000 + 8 octets * 5 * 1000 = 48000 octets
la source
DataFrame
?pandas
a une implémentation très efficaceread_table
en Cython (c'est beaucoup mieux que le loadtxt de numpy), donc je suppose qu'il analyse et stocke les données directement dans le fichierndarray
.Je crois que cela donne la taille en mémoire de tout objet en python. Les éléments internes doivent être vérifiés en ce qui concerne les pandas et numpy
la source