r - parLapply循环中多个文件在R中的curl内存使用情况

标签 r amazon-web-services ubuntu curl amazon-ec2

我有一个项目在 ec2 上多线程下载约 2000 万份 PDF。我最精通 R,而且它是一次性的,所以我最初的评估是 bash 脚本节省的时间不足以证明花在学习曲线上的时间是合理的。所以我决定只从 R 脚本中调用 curl。该实例是基于 ubuntu 的 c4.8xlarge rstudio 服务器,具有 36 个内核和 60 gigs 内存。

使用我尝试过的任何方法,它都会很快达到最大内存。它运行良好,但我担心交换内存会减慢速度。 curl_download 或 curl_fetch_disk 的工作速度比 native download.file 函数快得多(每 0.05 秒一个 pdf,而 0.2 秒),但它们都非常快地运行到最大内存,然后似乎用空文件填充目录。使用 native 函数,我通过大量使用 try() 和 invisible() 来抑制输出来处理内存问题。这似乎对 curl 包没有帮助。

如果有人可以帮助我,我有三个相关的问题。

(1) 我对内存使用方式的理解是否正确,因为不必要的内存交换会导致脚本变慢?

(2) curl_fetch_disk 应该直接写入磁盘,有没有人知道为什么它会使用这么多内存?

(3) 在 R 中有什么好的方法可以做到这一点,还是我最好学习一些 bash 脚本?

当前使用 curl_download 的方法

getfile_sweep.fun <- function(url
                          ,filename){
  invisible(
    try(
      curl_download(url
                ,destfile=filename
                ,quiet=T
      )
    )
  )
}

使用 native download.file 的先前方法
getfile_sweep.fun <- function(url
                            ,filename){
  invisible(
    try(
      download.file(url
                  ,destfile=filename
                  ,quiet=T
                  ,method="curl"
                  )
    )
  )
}

parLapply 循环
len <- nrow(url_sweep.df)

gc.vec <- unlist(lapply(0:35, function(x) x + seq(
from=100,to=len,by=1000)))

gc.vec <- gc.vec[order(gc.vec)]

start.time <- Sys.time()

ptm <- proc.time()
cl <- makeCluster(detectCores()-1,type="FORK")
invisible(
  parLapply(cl,1:len, function(x){
    invisible(
      try(
        getfile_sweep.fun(
          url = url_sweep.df[x,"url"]
          ,filename = url_sweep.df[x,"filename"]
        )
      )
    )
    if(x %in% gc.vec){
      gc()
    }
  }
  )
)
stopCluster(cl)
Sweep.time <- proc.time() - ptm

数据样本 -

url_sweep.df 示例:
https://www.dropbox.com/s/anldby6tcxjwazc/url_sweep_sample.rds?dl=0

现有文件名示例:
https://www.dropbox.com/s/0n0phz4h5925qk6/existing_filenames_sample.rds?dl=0

最佳答案

笔记:

1-我没有这么强大的系统可用,所以我无法重现提到的每个问题。

2-所有评论都在这里总结

3- 据说机器收到了升级:EBS to provisioned SSD w/ 6000 IOPs/sec ,但是问题仍然存在

可能的问题:

A- 如果内存交换开始发生,那么您也不是纯粹使用 RAM。我想R将越来越难找到可用的连续内存空间。

B- 工作负载和完成工作负载所需的时间,与核心数量相比

c- parallel设置和fork cluster
可能的解决方案和故障排除:

B- 限制内存使用

C- 限制核心数量

D-如果代码在像个人桌面这样的小型机器上运行良好,那么问题在于如何设置并行使用,或者使用 fork 集群。

仍然要尝试的事情:

A- 通常在 parallel 中运行作业招致 overhead , 现在更多 cores你有,你会看到更多的效果。当你通过很多只需要很少时间的工作时(认为小于秒),这将导致 overhead 的增加与不断插入工作有关。尝试限制core to 8就像您的桌面并尝试您的代码?代码运行正常吗?如果是,则尝试在增加程序可用的内核时增加工作量。

从内核数量和内存数量的低端开始,随着工作负载的增加而增加它们并查看下降发生的位置。

B- 我将发布一个关于 Parallelism in R 的摘要,这可能会帮助你捕获我们错过的东西

什么有效:
限制核心数量已经解决了这个问题。正如 OP 所提到的,他还对代码进行了其他更改,但是我无权访问它们。

关于r - parLapply循环中多个文件在R中的curl内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45926720/

相关文章:

r - purrr:如何提取列表元素的内容(而不是元素)

r - 仅从列表中的数据框中选择数字列

r - 如何在一张表中返回多个结果?

r - 获取 R 脚本的路径

amazon-web-services - 我可以使用 CloudWatch 警报扩展 AWS Spot 实例吗?

amazon-web-services - Amazon EC2 高可用性数据库架构

amazon-web-services - AWS 物联网 : Fleet indexing settings through CloudFormation

opencv - 使用 Makefile 编译时对 opencv 函数的 undefined reference

linux - 用于杀死 PID 的 Shell 脚本

ubuntu - haxe 找不到 haxelib 安装的 csv 库