【技术难题】多线程扫描本地文件快速入库,系统CPU、内存低耗

hoojo 2014-04-01 09:55:56

【场景】
本地有若干个目录(可以配置目录多少),用Java程序去扫描目录中的文件,其中每个目录的文件每秒都有文件不断的写入,就是会不停的新增文件,大概每秒20个文件左右。
ps:因为系统存在边界安全的问题,所以只能传输文件,不能进行http的网络直接访问!

【我的实现方案】
方案1、用Java程序去扫描目录中的文件,每个目录一个线程。每个线程扫描目录中的文件后就会调用入库方法进行保存入库,其中会涉及到一些业务(暂不理),入库后就会移除当前文件。
方案2、同上,用Java程序去扫描目录中的文件,每个目录一个线程。每个线程扫描目录中的文件后就会存放到一个线程队列(ConcurrentLinkedQueue)中,然后开辟可配置个数的线程进行循环读取文件队列ConcurrentLinkedQueue中的文件,调用入库方法进行保存入库,同样入库后就会移除当前文件。

【问题】
1、在Windows上运行应用,明显发现系统CPU和内存被程序占用,但在Linux上系统内存和cpu处于低耗状态,cpu使用率在120左右。
2、每秒移除文件的数量在6个左右,效率低下。没有文件增长的速度快,这样时间就了就存在大量文件堆积的情况。
ps:服务器硬件配置都高,24G内存、 双CPU * 8核心 * 双线程

不知道为什么在Linux上系统硬件资源利用不上去?还有不知道这种扫描文件的解决方案是不是根本行不通。

...全文
347 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hoojo 2014-04-01
  • 打赏
  • 举报
回复
引用 1 楼 u014371430 的回复:
把文件保存到库中感觉是不科学的方法. 通常我们把文件对应的路径+文件名存储到数据库中. 因为如果你文件过大. 同时读取的文件较多. 你内存得爆掉. 如果非要这么干. 那就到linux版区问问吧,这个牵扯到系统底层调用. 应该和java关系不是很大了 理论上你系统处理速度多牛b. jvm就能做到多牛b. 恕在下无能为力啊
ps:我是读取文件内容入库,不是在数据库中保存文件! 我的应用是一个JavaEE的Web项目,部署在tomcat或JBoss中。
tony4geek 2014-04-01
  • 打赏
  • 举报
回复
看过楼主的很多文章,谢谢。这个还是到Linux 里去问问,帮顶。。
jiekou0704 2014-04-01
  • 打赏
  • 举报
回复
学习了。。坐等大神
世人皆愚 2014-04-01
  • 打赏
  • 举报
回复
把文件保存到库中感觉是不科学的方法. 通常我们把文件对应的路径+文件名存储到数据库中. 因为如果你文件过大. 同时读取的文件较多. 你内存得爆掉. 如果非要这么干. 那就到linux版区问问吧,这个牵扯到系统底层调用. 应该和java关系不是很大了 理论上你系统处理速度多牛b. jvm就能做到多牛b. 恕在下无能为力啊

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧