R无法处理繁重的任务数小时

use*_*584 8 memory loops r freeze

我有一个压缩文件列表[~90个文件].我已经编写了一个循环来解压缩它们(每个文件大约1Gb),做一些计算,保存每个文件的输出并删除解压缩的文件.此过程的一次迭代需要每个文件30-60分钟[并非所有文件的大小完全相同].

我不太担心时间,因为我可以让它在周末工作.然而,R并没有设法完全通过.我在星期五晚上离开了它,它只运行了12个小时,所以它只处理了90个文件中的30个.

我不经常处理这种类型的重型过程,但过去在类似过程中也是如此.我需要在循环中插入任何命令以避免计算机因此密集过程而冻结吗?我gc()在循环结束时尝试无济于事.

是否有针对此类程序的"良好做法"建议清单?

zac*_*dav 6

如果您的会话冻结,您可能会遇到需要隔离的问题,因为它可能是单个文件,或者您可能会受到内存限制或大量使用交换.

无论如何,这里有一些你可以实现的技巧或想法:

  • 编写代码来处理文件作为单个案例,例如像 process_gz_folder().然后遍历文件路径并调用每次创建的函数,这样可以保持全局环境的清洁.
  • 正如您已经尝试过的,有时gc()可以提供帮助,但这取决于具体情况以及是否正在清除内存(rm()例如在运行后).可以在第一点调用函数后使用.
  • 你是否将每个文件夹的结果保存在内存中?每次迭代都会使这组结果变大吗?如果是这样,这可能会占用所需的内存 - 将结果作为合适的格式存储到磁盘将使您在处理完每个结果后累积结果.
  • 要添加到前一点,如果文件生成输出以确保其名称是合适的,甚至添加时间戳(例如inputfile_results_YYYYMMDD).
  • 代码可以检查文件是否已经处理并跳到下一个,这可以帮助从头开始重新启动,特别是如果检查文件是否处理的方法是使用输出的存在(带时间戳!).
  • 使用try()以确保故障不会阻止未来的迭代-但是这应该产生警告/输出通知失败的,这样就可以在以后回来.
  • 抽象方法可以是创建一个处理单个文件的脚本,它可以只包含第一个点的函数,继续setTimeLimit()并提供一个时间,如果文件未被处理,代码将停止运行.使用bash脚本迭代此脚本,调用所述R脚本Rscript,可以传递参数(例如文件路径).这种方法可能有助于避免冻结,但取决于您了解并设置可接受的时间.
  • 在处理代码时确定文件是否对于内存来说太大可能需要调整以提高内存效率,或者更改代码以逐步处理数据以避免内存不足.
  • 减少计算机上可能占用可能导致冻结的资源的其他任务.

这些只是一些想到的想法,可能是您的示例中要考虑的事情(给定提供的信息).查看一些代码并了解您在每个文件上执行的处理类型会有所帮助.