给定一个包含大量小文件(大于100万)的目录,有什么方法可以快速记住哪些文件已被处理(用于数据库导入)。在
我尝试的第一个解决方案是bash脚本:
#find all gz files
for f in $(find $rawdatapath -name '*.gz'); do
filename=`basename $f`
#check whether the filename is already contained in the process list
onlist=`grep $filename $processed_files`
if [[ -z $onlist ]]
then
echo "processing, new: $filename"
#unzip file and import into mongodb
#write filename into processed list
echo $filename #>> $processed_files
fi
done
对于较小的示例(160k个文件),此过程运行约8分钟(无任何处理)
接下来我尝试了一个python脚本:
^{pr2}$这只需不到2分钟。在
有没有一个我可以忽略的更快的方法?
其他解决方案:
只需使用一套:
使用标准命令行实用程序的替代方法:
只要
diff
一个包含所有文件列表的文件,以及一个包含已处理文件列表的文件。在容易尝试,而且应该相当快。在
如果您在列表中包含完整的时间戳,您也可以通过这种方式获取“已更改”的文件。在
如果文件在处理后没有被修改,一个选项是记住最新处理的文件,然后使用
find
的-newer
选项检索尚未处理的文件。在在哪里进程.sh看起来像
^{pr2}$这是未经测试的。在考虑实施这一策略之前,请注意不必要的副作用。在
如果一个老套的/快速的脏的解决方案是可以接受的,一个有趣的替代方案是在文件权限中对状态(已处理或未处理)进行编码,例如在组读取权限位。假设您的
umask
是022
,因此任何新创建的文件都具有644
的权限,在处理文件后将权限更改为600
,并使用find
的-perm
选项检索尚未处理的文件。在在哪里进程.sh看起来像
这也是未经测试的。在考虑实施这一策略之前,请注意不必要的副作用。在
相关问题 更多 >
编程相关推荐