R无法长时间处理繁重的任务

R unable to process heavy tasks for many hours

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

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

我不经常处理这种繁重的流程,但过去类似的流程也发生过同样的事情。是否需要在我的循环中插入任何命令以避免计算机因这种密集进程而冻结?我在循环结束时尝试 gc() 无济于事。

是否有针对此类程序的“良好做法”建议列表?

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

无论如何,这里有一些您可以实施的提示或想法:

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

这些只是 spring 需要考虑的一些想法,在您的示例中可能需要考虑这些事情(鉴于提供的信息)。这将有助于查看一些代码并了解您对每个文件进行的处理类型。

鉴于您提供的信息很少,很难判断真正的问题是什么。

如果可能的话,我会先解压并拼接文件。然后对数据进行预处理,去掉所有不需要分析的字段。然后生成的文件将用作 R 的输入。

另请注意,将输入字符串解析为例如时间戳可能非常耗时。