Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.9k views
in Technique[技术] by (71.8m points)

php或linux如何更高效率地筛选20万张图片,从里面删掉不要的部分?

公司有一个技术落后的网站项目,目录/uploads及其下面有多个以日期命名的子目录,保存了用户上传的图上约20万张,其中大部分是没用的,也就是用户不需要的。

有用的一小部分以url方式记录在数据库mysql某个表中,此表有5000多条记录,以字段contents记录包含图片url的数据,字段contents字段还是json_encode(array()), array里面有文字,也有图片的url。
`

$array_contents=array(
    'title'=>'*******',
    'msg'=>array(...),
    'img_1'=>'http://domain.com/uploads/aaaa_2011101501.jpg',
    'img_2'=>'http://domain.com/uploads/20111015/aaaa_20111015001.jpg',
    'img_3'=>'http://domain.com/uploads/20111015/aaaa_20111015002.jpg',
    'img_4'=>'http://domain.com/uploads/aaaa_2011101502.jpg',
    ...
);

`

现在老板要求把没用的图片删掉,只保留数据库中存储的一部分。

我目前没有好办法,只想到循环。 我只能想到的思路是把所有有用的图片url提出来作为一个array_valid,所有20万张图片作为array_all,但这样一来,循环的数量太大,隐约感觉会卡死。

麻烦大家提点下,不论是用php还是linux命令,如何更高效率地筛选20万张图片,从里面删掉不要的部分?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

才 20W 的数据量……能有啥瓶颈?是不是想多了……

不就是个取差集么,Shell 里直接就能做了,用不着那么复杂:

# 你自己先把数据库的路径取出来,开头域名自己 replace 替换成本地路径
# 一行一个,存到 /tmp/src-db.txt 里

# 进到你自己存图片的那个目录里
cd /uploads 

# 列出当前目录下所有文件(含子目录)的完整路径
# 一行一个,存到 /tmp/src-dir.txt
ls -R |awk '{print i$0}' i=`pwd`'/' > /tmp/src-dir.txt

# 取 src-db.txt、src-dir.txt 差集
# 结果存到 /tmp/output.txt
sort /tmp/src-db.txt /tmp/src-dir.txt | uniq -u > /tmp/output.txt

# /tmp/output.txt 里就是本地有、数据库里没有的所有文件路径了,挨个删除吧
# 写 Shell 循环或者 PHP 循环都行,看你自己意思了

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...