簡體   English   中英

熊貓數據框和CSV文件之間的內存不匹配

[英]memory mismatch between pandas dataframe and csv file

我正在處理類似於以下博客的大型excel文件。

https://www.dataquest.io/blog/pandas-big-data/

這篇文章是關於將對象類型列轉換為類別類型的。 這減少了數據幀的內存使用量。

我正在使用88 MB的Excel文件。 在代碼中提到的步驟之后,我能夠將df的大小減小到28 MB。 問題是當我將其寫入csv文件時,該文件大小為193 MB,大於原始csv文件。

問題:什么原因導致內存不匹配以及如何解決? 提前致謝。

import pandas as pd
df=pd.read_excel('games_log.csv')
df.info(memory_usage='deep')


def mem_usage(pandas_obj):
    if isinstance(pandas_obj,pd.DataFrame):
        usage_b = pandas_obj.memory_usage(deep=True).sum()
    else: # we assume if not a df it's a series
        usage_b = pandas_obj.memory_usage(deep=True)
    usage_mb = usage_b / 1024 ** 2 # convert bytes to megabytes
    return "{:03.2f} MB".format(usage_mb)

#This part converts the columns of object type to category type
converted_obj = pd.DataFrame()
for col in df.columns:
    num_unique_values = len(df[col].unique())
    num_total_values = len(df[col])
    if num_unique_values / num_total_values < 0.5:
        converted_obj.loc[:,col] = df[col].astype('category')
    else:
        converted_obj.loc[:,col] = df[col]


print(mem_usage(converted_obj)) 
print(mem_usage(df))

converted_obj.to_csv('compressed_file.csv',index=False)

最后一行將數據幀寫入csv,但是文件大小很大。

  1. 給定條件if num_unique_values / num_total_values < 0.5:所有列均為True
  2. 根據您顯示的內容,所有代碼都可以替換為以下代碼:

新代碼:

game_logs.csv = 132.901MB
df = pd.read_csv('game_logs.csv', dtype='category')
df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 171907 entries, 0 to 171906
Columns: 161 entries, date to acquisition_info
dtypes: category(161)
memory usage: 52.8 MB

df.to_csv('game_logs_new.csv', index=False)
game_logs_new.csv = 133.069MB
  1. 對於您的代碼,減少了使用的內存量,但是當您保存文件時,它會更大。 在這種情況下,您應用的轉換可能以某種方式將數據添加到了DataFrame中。
  2. 我認為您正在嘗試執行的操作是通過DataFrame轉換來減小文件的實際大小, DataFrame不會發生(除非您刪除大量數據)。
  3. 不同的dtype以不同的方式存儲在內存中; 有些比其他的效率更高,但是當您將其保存回csv ,您仍然只是存儲一堆文本; dtypeDataFrame沒有被維持在csv

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM