我正在开发一个scraper,它可以浏览网站并在Sidekiq worker中解析其中的特定部分。想象一下,当scraper访问一个包含10个我感兴趣的元素的网站时,每个元素都在Sidekiq中排队。现在我将元素的源代码作为参数传递,稍后将加载到Nokogiri中。我的问题是-将一个巨大的字符串作为参数传递给Sidekiq worker是个好主意吗?字符串的长度总是在77,000 - 80,000个字符之间,所以它真的很大。或者我应该把它存储在一个临时表中,然后在Nokogiri加载之前找到特定的记录?
2条答案
按热度按时间nhaq1z211#
我建议将字符串存储在S3(或任何其他对象存储)上,并使用返回的URL来获取字符串并处理作业。
这样你就可以确保一个小型的Redis服务器可以支持许多并发的sidekiq作业,并且不会耗尽RAM。
zpgglvta2#
正如其他人评论的那样,最好让你的worker参数尽可能小。你应该传递你的worker完成任务所需的最小可能数据。如果您使用的是Sidekiq,您可能需要考虑内存大小。请参阅sidekiq内存使用重置
根据并发性,存储大型字符串对象可能会成为内存问题。你可以在ruby中得到一些关于字符串内存大小的想法:
更新:
如果你想检查非字符串数据(如哈希)的内存大小,你可以使用如下方法: