我写了一个智能的bulkdownloader。我的下载程序将图片网址加载到字符串数组中。这被锁定用于多线程使用(一个线程正在加载URL,另一个线程正在下载URL后面的内容)。
我的问题:这些长网址需要大量的内存(我们谈论超过50.000个网址)是否有任何替代方法可以将它们存储在内存中?也许有临时文件?如何锁定它们以使用具有多个线程的文件?
感谢您的帮助
答案 0 :(得分:2)
处理此问题的最佳方法是使用事务数据库。数据库中的每一行都有要检索的URL和下载文件的文件名。如果文件名为NULL,则表示该文件尚未下载。如果文件名为空,则表示该文件当前正在下载。
因此,每个线程都会打开一个与数据库的新连接,(因为每个连接发生事务隔离),开始一个事务,找到一个空文件名的第一行,将空字符串存储到文件名中,提交事务,并开始下载文件。下载完成后,会更新文件名。 (此时不需要任何事务,因为没有其他线程会触及此行,因为该行已经具有非空文件名。)
答案 1 :(得分:1)
无论如何,内存的替代品都是文件。 也就是说,如果您的程序消耗太多RAM,只需将它们存储在文件中即可。 Windows和Linux将加速使用最近使用的文件,因此阅读它们将比最近未触及的文件快得多。
处理文件的最简单方法是下载到内存,然后一次性写入临时文件(= final filename +“。t”或其他类似文件),最后重命名为最终文件名。
除此之外,我认为你的任务更多地受下载速度的限制,而不是队列/线程管理。因此,我建议有更多线程下载图片。我尝试每个CPU 1个,每个CPU 2个,等等。 如果图片来自许多不同的服务器,则最佳线程数将高于单个服务器。
编辑: 如果问题是队列大小(非常长的网址X很多)我会去一个文件。 当读者使用他们自己的文件描述符读取它们时,编写者线程可以将URL添加到文件中。 您可以使用long来标记读取位置,并在抓取队列中的URL时让每个读者以原子方式递增它。 为此,文件的格式应包含url长度的int url长度,以便读者: