Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用数据帧减少内存使用_Python_Pandas_Dataframe_Memory Management - Fatal编程技术网

Python 使用数据帧减少内存使用

Python 使用数据帧减少内存使用,python,pandas,dataframe,memory-management,Python,Pandas,Dataframe,Memory Management,我正在耗尽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 st

我正在耗尽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))
我的问题是:

  • 为什么创建单个4500 x 1000000数据帧时内存不足,而创建十个4500 x 100000数据帧时内存不足
  • 我能做些什么来减少我的内存使用吗
  • 上述代码中是否存在任何严重错误或不良做法

  • 谢谢你的帮助和时间

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


    另外,内存和CPU的使用似乎有些混乱

    您不会一次创建/存储十个较小的数据帧。在循环中执行此操作,并在迭代循环时覆盖变量。但多处理函数不就是这样做的吗?通过将三个核心分配给Pool(),我不是一次创建(最多)三个数据帧吗?直到我创建了10个数据帧,然后将它们组合到temp中?感谢您的响应。我一定去达斯克看看。然而,我不认为在这种情况下,我将CPU与内存混为一谈。我在PyCharm中得到的信息是“无法分配X GB”内存。我的CPU使用率约为70-80%。我猜在这种情况下不可能使用GPU?对,是的。我的观点是,使用多处理并没有帮助管理内存——它有助于利用更大比例的CPU,但如果您试图存储的数据不适合RAM(CPU从其中读取),那么无论什么处理器试图访问它,您都会得到该错误。对。我之所以使用多处理,是因为如果不这样做的话,它将永远无法运行——这是一个CPU问题。我只是试图构建一个数据帧,而PyCharm没有告诉我没有足够的RAM(即使我有64GB)。实际上,我希望有一个1000万行的数据帧,而不是100万行的数据帧——但恐怕这绝对不是我的能力范围。我会调查达斯克的。希望这能奏效:)