大批量文件下载

今天碰到个问题:批量下载十几万张图片、且分散在很多网站上。

迅雷、FlashGet都有导入URL列表,然后批量下载的功能。但URL上万以后,速度很慢,界面几乎无响应甚至异常退出。最大任务数才几十,不给力。而图片文件又很小,单个文件不值得再多线程下载了。所以用下载工具不合适。

单下一张图片时,时间都是秒级的。系统所在SSD的IOPS大约50000,估计来几千个线程也能HOLD住。于是写了个C++程序,开300个线程,每线程再用system函数调用wget下载(中间还要经过cmd.exe去调用,实际是600个程)。效果还不错。

正下得起劲时,看日志发现个缺陷:同一网站的内容随机分给多个wget,导致频繁重连,费了不少时间。给每个wget进程的URL最好在相同域上,又想出个办法:写段脚本把URL按域分成几百份,每个wget一份名单,照着下去,既快又简单。
(先前的程序就当是做多线程的习题了尴尬

另:中间想改进时,杀掉了主程序。但任务管理器中看,系统还有几百个 cmd.exe 进程。手工删了几十个,烦了。linux有killall,Windows呢?……搜了下,有对应的:

  • tasklist 查看所有进程
  • tasklist /fi "imagename eq cmd.exe" 列出所有叫“cmd.exe”的进程。
  • taskkill /fi "imagename eq cmd.exe" /f 杀掉所有叫“cmd.exe”的进程。世界清静了……安静

Java实现大批量文件上传可以采用以下两种方式: 1. 使用Apache Commons FileUpload组件,该组件提供了一个简单易用的API来解析文件上传请求。您可以使用该组件轻松地从Web应用程序中接收上传的文件,并将其存储在本地文件系统或数据库中。示例代码如下: ``` // 创建一个新的文件上传处理程序 ServletFileUpload upload = new ServletFileUpload(); // 解析上传请求 FileItemIterator iter = upload.getItemIterator(request); while (iter.hasNext()) { FileItemStream item = iter.next(); String name = item.getFieldName(); InputStream stream = item.openStream(); // 处理上传文件流 if (!item.isFormField()) { // 将文件保存到本地文件系统或数据库中 // ... } } ``` 2. 使用HTML5的File API,该API可以让客户端直接上传文件,从而减轻服务器端的压力。您可以使用该API将文件分割成多个部分,并将它们分别上传到服务器。示例代码如下: ``` // 创建一个新的XMLHttpRequest对象 var xhr = new XMLHttpRequest(); // 设置上传进度回调函数 xhr.upload.addEventListener('progress', function(e) { var percent = Math.round((e.loaded / e.total) * 100); console.log(percent + '% uploaded'); }); // 设置上传完成回调函数 xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { console.log('Upload complete!'); } }; // 打开一个新的POST请求 xhr.open('POST', '/upload', true); // 创建一个FormData对象 var formData = new FormData(); // 将文件添加到FormData对象中 formData.append('file', file); // 发送请求 xhr.send(formData); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值