我们有一个巨大的不同网址的文件(~500K - ~1M urls(。
我们希望使用 Grinder 3 将这些 URL 分发给 Workers,以便每个 worker 都会调用一个不同的 URL。
在 JY 脚本中,我们可以:
-
每个代理读取文件一次
-
为每个代理分配行号范围
-
每个工作线程都会根据其运行 ID 从其代理行号范围获得一个行/URL。
这仍然意味着将一个巨大的文件加载到内存中,并为许多人可能常见的问题编写一些代码。
对更简单/现成的解决方案有什么想法吗?
前我以类似的方式使用了 Grinder,并编写了一个用于从大文件中一次性摄取 URL 的多线程实用程序。
请参阅 https://bitbucket.org/travis_bear/file_util - 特别是顺序读取器。
我建议在执行 Grinder 运行之前使用 split
命令行实用程序(或类似工具(为每个代理提供单独的主文件块。
如果您愿意,我会采取不同的方法,因为它是一个大文件,您计划生成多少个线程.我相信你已经知道你可以得到Grinder.ThreadNo来获取当前正在执行的线程。您实际上可以使用具有相等记录数的预处理器将文件划分为线程数,并将它们命名为与线程名称匹配的 0、1、2 等。
为什么我建议这样做是处理文件看起来像一个预任务,重要的是它的内容。线程正在执行时,文件处理不应干扰。
所以现在每个线程都有自己的文件,没有冲突。
例如 20 个线程20 个文件,但是您的线程数应仔细选择,可能是峰值 + 50 %。