背景- TLDR:我的项目中有内存泄漏
花了几天时间用scrapy查看内存泄漏文档,但找不到问题。我正在开发一个中等规模的scrapy 项目,每天大约有 4 万个请求。
我使用scrapinghub的预定运行来主持这个。
在scrapinghub 上,每月 9 美元,您基本上可以获得 1 个具有 1GB RAM 的 VM 来运行您的爬虫。
我在本地开发了一个爬虫并上传到scrapinghub,唯一的问题是在运行结束时,我超出了内存。
本地化设置CONCURRENT_REQUESTS=16工作正常,但导致超过 50% 点的scrapinghub内存。当我设置 时CONCURRENT_REQUESTS=4,我在 95% 点超过了内存,因此减少到 2 应该可以解决问题,但是我的爬虫变得太慢了。
另一种解决方案是为 2 个 VM 付费以增加 RAM,但我有一种感觉,我设置爬网程序的方式会导致内存泄漏。
对于此示例,该项目将抓取在线零售商。在本地运行时,我的memusage/max是 2.7gb 和CONCURRENT_REQUESTS=16.
我现在将运行我的scrapy结构
class Pipeline(object):
def process_item(self, item, spider):
item['stock_jsons'] = json.loads(item['stock_jsons'])['subProducts']
return item
Run Code Online (Sandbox Code Playgroud)
class mainItem(scrapy.Item):
date = scrapy.Field()
url …Run Code Online (Sandbox Code Playgroud) (GNU Parallel 的新功能)
我的目标是在多个核心上运行具有不同参数的相同 Rscript。我的第一个问题是让它在我的笔记本电脑上运行(2 个真实核心,4 个虚拟核心),然后我将其移植到 64 个核心的笔记本电脑上。
现在:
我有一个 Rscript,“Test.R”,它接受参数,做一件事(比如添加一些数字,然后将其写入文件),然后停止。
我有一个“commands.txt”文件,其中包含以下内容:
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 100
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 50 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 50 200 1000
Run Code Online (Sandbox Code Playgroud)
所以这告诉GNU并行使用R运行Test.R(我已经使用anaconda安装了它)
在终端中(导航到 Test.R 和 Commands.txt 所在的桌面后),我使用以下命令:
parallel --jobs 2 < commands.txt
Run Code Online (Sandbox Code Playgroud)
我想要做的是使用 2 个核心,并运行commands.txt 中的命令,直到所有任务完成。(我尝试过此命令的变体,例如将 2 更改为 1,在这种情况下,其中 2 个核心以 100% 的速度运行,另外 2 个核心以 20-30% 的速度运行)。
当我运行此命令时,所有 4 个核心都达到 100%(从 htop 可以看出),并且前 2 个作业完成,并且没有更多作业完成,尽管所有 4 个核心仍处于 100%。 …
例如,如果在运行数百万次试验的函数中,以下两种运行速度会不同.
the.name.of.a.random.variable.in.r <- some.value
variable <- some.value
Run Code Online (Sandbox Code Playgroud)
然后扩展这个如何与函数名称相关.
说我有两个向量,
set <- c(1, 1, 1, 1, 3, 3, 4, 4, 8, 8, 10)
played <- c(1, 3, 1, 4)
Run Code Online (Sandbox Code Playgroud)
我想删除原始集中的"播放"数字,但我不想删除所有的1,3或4.这样得到的矢量应该是,
1,1,3,4,8,8,10
Run Code Online (Sandbox Code Playgroud)
目前我正在使用循环,但这不是一个非常有效的方法.有功能可以做我想要的.
注意:这不是重复 如何从向量中删除多个值? 而是一个扩展,所有关于不删除所有值.
重新编辑:我说订单很重要,但我错了.
我想加载除了一个函数之外的整个包。
我看到了解决方法,例如如何从包中仅加载特定函数 ,但这并不能满足我的全部需求。
具体问题是使用加载 MASS 和 tidyverse 包中的 select() 函数,但我想要一个更通用的解决方案。
谢谢。
r ×4
anaconda ×1
gnu-parallel ×1
memory ×1
performance ×1
python ×1
scrapinghub ×1
scrapy ×1
variables ×1