使用数据帧减少内存使用

2024-04-20 16:01:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在耗尽RAM,同时直接生成4500 x 1000000个相关模拟数据帧。在下面的代码中,我将模拟分为十个部分(100000个模拟的10个实例/通过秩相关矩阵连接的4500个时间序列中的每一个的实例),这允许我停留在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. 为什么创建单个4500 x 1000000数据帧时内存不足,而创建十个4500 x 100000数据帧时内存不足
  2. 我能做些什么来减少我的内存使用吗
  3. 上述代码中是否存在任何严重错误或不良做法

谢谢你的帮助和时间


Tags: fromimportdfprefixtimefilenameyeartemp
1条回答
网友
1楼 · 发布于 2024-04-20 16:01:06

您可以尝试读取文件并指定“块大小”。这也将在循环中运行,但您需要将代码的读取数据部分与代码的处理数据部分完全分离。 实现这一点的类似方法是使用名为dask的模块。此模块使用数据帧,但会自动将数据拆分为可管理的大小

另外,内存和CPU的使用似乎有些混乱Check out this question and responses.

相关问题 更多 >