Java-如何高效遍历最新文件的方法
我这边有一个程序在不断定期扫描一个数据文件里的文件,就像日志文件一样,里面有部分文件是在不断更新的,程序扫描到文件以后会把最新增加的内容录入到数据库中
我用的是php的读取文件夹的方法遍历目录里的所有文件,然后对比上次扫描记录的每个文件更新的时间,如果文件更新更新,则读取文件内容,并把最新的内容录入到数据库中,但现在发现,由于文件越来越多,在程序扫描时间间隔比较短的情况下,程序占用的cpu非常高,而且整个程序运行的效率也越来越低,但也不能把程序扫描的频率调得太低,因为要确保新数据尽快入库,想问一下有没有更高效方便的办法?
程序运行环境是linux,如果能用php解决就尽量用php,因为这个数据格式化以后入库方便一些,求方案,我期望的是通用性的程序
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
如果是通过遍历来做,这样效率肯定很难提高,PHP的实现方案我不太清楚,个人还是偏向于用C,使用inotify或者EPOLL来做,另外一个更便捷的方式是采用node.js,其封装了inotify和Mysql操作,编码工作简单。
不知道你能不能操作写这些日志的代码,如果可以,你可以让其生成一个总的日志文件,这个日志文件的内容是它更新的哪个日志文件的文件名,这样你就不用去遍历目录判断文件大小来确定是否文件被更新了了,因为所有的更新记录都在这个日志文件里,这里其一,其二,由于上次操作所有的文件都记录了每个文件的记录偏移,你可以直接定位并得到每个新文件更新的新内容,然后再插入数据库。这样就省去了查找文件的环节,只需要读日志数据文件,然后定位,再操作数据库,应该会更快。
弄个文件大纲文件,里面只存文件原始路径,上次扫描的记录行号、上次扫描完文件大小和目前文件大小。这样如果你的程序检测到文件更新,根据该大纲直接定位到上次扫描的地方,根据上次扫描的文件大小和目前文件大小判断出新增数据的大小。这样数据的起始知道了,大小知道了,直接插入数据库,会比较快些!
用stat函数做了一个c语言版本的方式:
int file_is_modified(const char *path, time_t oldMTime) {
struct stat file_stat;
int err = stat(path, &file_stat);
if (err != 0) {
perror(" [file_is_modified] stat");
exit(errno);
}
return file_stat.st_mtime > oldMTime;
}
我来说一下自己后来的改进方案吧,我是利用shell命令来代替php获取目录下的所有文件的,我使用了类似下面的命令来获取文件列表:
find /dirpath/log/ -name XXX* -mmin -3
这个表示列出/dirpath/log/目录下,以XXX开头的,最近三分钟内发生过改变的文件,通过php里面的exec执行这个命令,每次只会返回几个发生过改变的文件,我的程序只要拿这几个文件的信息来跟我上一次获取到的信息进行对比,如果文件大小增加了,我则会把文件的新内容录入到数据库中。
经过这样的优化,程序效率提高了不少。