簡體   English   中英

使用 Pandas DataFrame 減少內存使用

[英]Reducing memory usage with Pandas DataFrame

我的 RAM 用完了,而直接生成了 4,500 x 1,000,000 的相關模擬數據幀。 在下面的代碼中,我將模擬分為十個部分(100,000 個模擬的 10 個實例/通過秩相關矩陣corr_matrix連接的 4,500 個時間序列中的每一個的實例),這使我能夠保持在 RAM 上限以下:

import pandas as pd
import os
from multiprocessing import Pool
from scipy.stats.distributions import t
from time import time
from statsmodels.sandbox.distributions.multivariate import multivariate_t_rvs as mv_t

filename_prefix = 'generation\\copulas'


def sim(iterable) -> pd.DataFrame:
    corr_file, year, part_num, n_sims, df = iterable
    corr = pd.read_pickle(corr_file)
    copula = pd.DataFrame(t.cdf(mv_t(m=([0] * corr.shape[0]), S=corr, df=df, n=n_sims), df=df))
    copula.columns = corr.columns
    copula.columns.names = corr.columns.names
    copula.to_pickle('%s\\year_%s\\part_%s.pkl' % (filename_prefix, (year + 1), part_num))
    return copula


def foo(corr_file: str, n_years: int, n_sims: int, n_parts: int = 10, df: int = 3):
    start = time()
    for year in range(n_years):
        part_size: int = int(n_sims / 10)
        temp_dir: str = '%s\\year_%s' % (filename_prefix, year + 1)
        temp_file: str = '%s\\year' % temp_dir
        os.makedirs('%s\\year_%s' % (filename_prefix, year + 1))
        with Pool(3) as p:
            collection = p.map(func=sim, iterable=[(corr_file, year, x, part_size, df) for x in range(n_parts)])
        temp = pd.concat(collection)
        temp.to_pickle('%s\\year_%s.pkl' % (filename_prefix, year + 1))
    print('\tRun time = %s' % (time() - start))

我的問題是:

  1. 為什么創建單個 4,500 x 1,000,000 DataFrame 時內存不足,而創建十個 4,500 x 100,000 DataFrame 時卻沒有?
  2. 我能做些什么來減少我的內存使用量嗎?
  3. 上述代碼中是否有任何嚴重的錯誤或不良做法?

感謝您的幫助和時間!

您可以嘗試讀取文件並指定“chunk_size”。 這也將在循環中運行,但您需要將代碼的讀取數據部分與代碼的處理數據部分完全分開。 完成此操作的類似方法是使用名為dask的模塊。 該模塊使用數據幀,但會自動將數據拆分為可管理的大小。

PS似乎對內存和CPU使用率有些困惑。 看看這個問題和答案。

暫無
暫無

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

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