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

问题描述 投票:8回答:2

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

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

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

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

r loops memory freeze
2个回答
6
投票

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

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

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

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


0
投票

鉴于您提供的信息很少,很难说出问题究竟是什么。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.