【问题标题】:Store an increasing matrix into HDD and not in memory将递增的矩阵存储到 HDD 中而不是内存中
【发布时间】:2017-07-15 13:45:46
【问题描述】:

当我恼人地运行以下代码时,我遇到了一个非常预期的问题,该代码为指定序列创建所有可能的组合,然后将它们存储在 final.grid 变量中。问题是,不仅有一个序列,而且大约有数十万个序列,每个序列都可以有足够的组合。

for()...
   combs = get.all.combs(sequence)
   final.grid = rbind(final.grid, combs)

无论如何。尝试在具有 4GB RAM 的 Windows PC 中运行我的代码,并在 4 小时后(甚至没有计算出一半的组合)R 返回此错误

错误:无法分配大小为 4.0 Gb 的向量

我的解决方案是在每次迭代后将 final.grid 写入文件,释放分配的内存并继续。事实是,我没有使用 R 进行此类实现的经验,我不知道选择哪种解决方案以及是否有一些解决方案会做得更好、更有效。请记住,我的最终网格可能需要一些 GB。

在堆栈交换的某个地方,我读到了有关 ff 包的信息,但没有关于该主题的足够讨论(至少我没有找到它)并且更愿意在这里征求您的意见。

谢谢

【问题讨论】:

    标签: r out-of-memory allocation


    【解决方案1】:

    我不能很好地理解你的问题,因为你输入的那段代码并不清楚你的问题。

    但是,您可以尝试将结果保存为 .RData.nc 文件,具体取决于数据的性质。但是,如果您更明确地说明您的问题可能会更好,例如显示 get.all.combs 函数或 sequence 数据背后的代码。

    【讨论】:

    • 我不认为在这里发布整个代码将有助于解决问题。函数 get.all.combs() 返回一个包含 4 列和很多行的巨大矩阵。然后将该矩阵附加(在每个序列之前)到 final.grid 矩阵,该矩阵可以达到一些 GB。
    【解决方案2】:

    您可以尝试的一件事是memory.limit() 函数,看看您是否可以为您的工作分配足够的内存。如果您的 Windows 操作系统是 32 位,这可能不起作用。

    如果你的程序的某些部分不需要大数据对象,你可以先save它们,然后使用'rm'删除它们,当你再次需要它们时,你可以load对象。

    下面的链接包含可能对您有用的更多信息。 Increasing (or decreasing) the memory available to R processes

    编辑: 您可以使用object.size 函数查看您拥有的对象的内存需求。如果它们太大,请尝试仅在需要时加载它们。

    您使用的某个函数可能会尝试分配比您拥有的更多的内存。看看您是否可以尝试找到程序崩溃的确切位置。

    【讨论】:

    • 我将尝试将 memory.limit() 设置为 3GB,看看会发生什么。
    • 如果您将其设置为 3 Gb,那么这意味着您正在减少 R 可用的内存大小。这无济于事。
    • 你是对的。没有改变。关于您的编辑:我不想加载任何内容。我只是有一个对象(矩阵),它通过迭代变得越来越大,直到它填满内存。现在我将尝试将这个对象拆分为 2Gb 的许多部分。
    • 通过加载,我的意思是仅在需要时将它们(大对象)保留在内存中。您可以保存和删除它们,直到您需要它们,然后加载它们。
    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多