zoukankan      html  css  js  c++  java
  • 创建文件测试

    今天做了个测试,生成100万个文件:

    脚本如下:

    第一种脚本1个,makefile.sh

    ./file0.sh & ./file1.sh & ./file2.sh & ./file3.sh & ./file4.sh & ./file5.sh & ./file6.sh & ./file7.sh & ./file8.sh & ./file9.sh

    第二种脚本10个,file*.sh

    #!/bin/bash
    for filename in $( seq 1 100000 )
    do
    touch ${filename}.txt
    done

    chmod 777 *.sh后,time ./makefile.sh

    [root@server2 file]# time ./makefiles.sh
    real    12m33.165s
    user    0m55.967s
    sys     1m7.424s

    ls的查看需要这么长时间哦

    [root@server2 file]# time ls
    。。。。。。
    real    1m29.619s
    user    0m7.660s
    sys     0m17.980s

    基本上在百万级别,ls都成为很耗时的事情了。

    ls完了之后就删除吧,结果

    [root@server2 file]# time rm -rf *.txt
    -bash: /bin/rm: Argument list too long
    
    real    0m7.475s
    user    0m4.928s
    sys     0m2.543s

    删不掉啊!!!强制也没用,一个一个来吧!!!

    [root@server2 file]# time rm -rf 1*.txt
    
    real    0m29.025s
    user    0m2.653s
    sys     0m5.925s

     2018年2月22日追加

    最快的方法是使用rsync同步一个空目录

    mkdir empty_dir
    rsync -a --delete empty_dir/ yourdirectory/

    sync删除的原理详见http://blog.liulantao.com/why-can-rsync-rapidly-delete-400000-files.html

    在Linux下使用 "rm -rf *" 试图删除非常大量的小文件时,可能会报类似下边的错误:

     /bin/rm: Argument list too long.

         这是因为通配符"*"在执行时会被每个匹配的文件名来替换,例如“rm -rf file1 file2 file3 file4″。

    系统只分配了一个比较小的缓冲区用来对这个列表进行排序,如果这个缓冲区满了,则shell不能执行这个命令。

        为了解决这个问题,很多人使用find命令来操作。即用find查找每一个文件,然后把文件名一个接一个的传递个rm命令,形式如下:

    find . -type f -exec rm -v {} ;

    这方法太慢。

    http://www.stevekamerman.com/2008/03/deleting-tons-of-files-in-linux-argument-list-too-long/

    给出了方法:

    find . -type f -delete
    find . -type d -print -delete

    最好不要用-print参数看,没啥意思。直接df -i看呗!

  • 相关阅读:
    ASP.NET MVC的过滤器
    EasyUi 合并单元格占列显示
    Ajax异步请求阻塞情况的解决办法
    AutoFac使用总结
    CodeFirst迁移注意点
    DataTable与实体类互相转换
    mysql中注释的添加修改
    MySql修改数据表的基本操作(DDL操作)
    MySql中的约束
    如何使用单例模式返回一个安全的Connection
  • 原文地址:https://www.cnblogs.com/tcicy/p/8353103.html
Copyright © 2011-2022 走看看