这段代码有啥问题嘛?程序猿一直没看出问题来

  • 我好像是小号
    如题目。。。。就是保存图片嘛,现在是设置成最多保存10张图片,超过10张就删除一张保存一张。这样就不会慢。
    如果我保存一百张或者几千张,就会越来越慢,可以慢好几秒,夸张的不行。
    是SSD哎。

    程序猿好几个月了,实在找不出问题在哪里
    没办法,只能求助一下各位了,人多力量大,当局者迷旁观者清嘛


    1. //save ok marked image and respectly model image
    2. QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd_hh-mm-ss_zzz");
    3. {
    4. QString path = QString("%1/history/camera%2/ok-%3/okpicture")
    5. .arg(QDir::currentPath())
    6. .arg(i + 1).arg(checkId() - 1);
    7. QDir dir(path);
    8. if(!dir.exists())
    9. dir.mkpath(path);

    10. QString fileName = QString("%1/%2.jpg").arg(path)
    11. .arg(date);
    12. bool save_ok = cv::imwrite(fileName.toStdString(), source);
    13. if(!save_ok){
    14. Utils::record->insertOperation("OK图片保存失败");
    15. cv::imwrite(fileName.toStdString(), source);
    16. }

    17. QFileInfoList flist = dir.entryInfoList(QStringList() << "*.jpg" << "*.bmp", QDir::Files | QDir::NoDotAndDotDot, QDir::Time);
    18. if(flist.size() > MAX_OK_COUNT){
    19. QFile::remove(flist.back().absoluteFilePath());
    20. }
    21. }
    复制代码

    iOS fly ~
  • x
    xfygx
    linux system? 目录有一个用于遍历文件的file entry list,目录使用的越久(增删),这个list就越大。你可以用 ls 看一下目录的大小(不含目录内文件),是不是很大?很大就是慢的原因。
  • 我好像是小号
    回复2#xfygx


    是linux,图片一张是400多kb,图片越多确实文件夹越大
  • 我好像是小号
    打印测试过,遍历文件不慢。图片很多的时候,好像是保存慢
  • 我好像是小号
    这个我之前测试上千个文件也很快的
  • c
    chykey
    又来白嫖了?
  • w
    wsyx87930
    我愿称你为地板白嫖小王子
  • 痴汉
    其实楼主比那些个整天发政治贴带风向的id好多了至少帖子能让人动动脑
  • 我好像是小号
    回复10#痴汉
    孔子说,温故知新,可以为师矣嘛
    这个确实是孔子说的 iOS fly ~
  • 浊水桥
    楼主真把这里当stackflow了啊
  • t
    tsounny
    楼主又来白嫖啊,你这是白嫖成性的节奏。
  • b
    badloop
    ssd有缓存 你这么写十张还不到落盘的时候 所以不卡 写多了就要开始落盘了 读写速度跟不上 iOS fly ~
  • 我好像是小号
    经过打印测试,遍历文件夹,就算几千张图片速度很快。几百上千图片之后,慢好像是慢在保存上面。奇怪了,
  • 2
    2016102
    建议小号白嫖的同时,写写工作总结,也回馈一下后来的从业者。
  • 我好像是小号
    比如?文化水平不行哎,下笔没有神
  • w
    wwwEagle
    stackoverflow
  • 我好像是小号
    难怪我百度不出来stackflow
  • s
    suifeng123
    运行的时候查看一下内存占用看看?
    另外,保存过的文件都关闭了吧?
  • z
    znm
    看起来和磁盘相关,Linux 读写大量小文件导致,
    说本地磁盘么?
    可能要优化下磁盘或者写入方式 iOS fly ~
  • a
    alvise
    不要建在一个文件夹里面,分开保存....
    你在linux里面用的什么分区格式
  • 猪猪代购
    cv是啥类的对象
  • 我好像是小号
    opencv
  • 我好像是小号
    回复22#alvise


    就标准的ubuntu系统哎
  • a
    am99
    如果这个函数是高频调用的那应该仅保留必要的功能在里面,
    比如,flist可以在loop之前从存储读取,此后都可以以变量形式在内存中维护。
    如果这个目录是多进程同时在处理的话那么上面的方法无效,但是可以新开个进程专门处理目录中删图的操作。


    又,你在用CV?是不是在读视频流?必须异步多进程消息队列。否则视频帧和磁盘保存在同以进程里相互等待会阻塞,简单的表象就是12:00打开程序,12:10时你刚刚存下的图片可能是12:08产生的,还有一堆视频帧在内存中拥堵着
  • 我好像是小号
    每次执行都要保存图片,应该算高频调用,经过打印测试,遍历文件夹,就算几千张图片速度很快。几百上千图片之后,慢好像是慢在保存上面。奇怪了,
  • a
    am99
    回复27#我好像是小号


    又,你在用CV?是不是在读视频流?必须异步多进程消息队列。否则视频帧和磁盘保存在同以进程里相互等待会阻塞,简单的表象就是12:00打开程序,12:10时你刚刚存下的图片可能是12:08产生的,还有一堆视频帧在内存中拥堵着
  • 退
    退休工人
    不懂,帮号弟顶一下。
  • 猪猪代购
    回复24#我好像是小号


    opencv的图片保存,要先按照格式压缩再保存,肯定慢。
    这里得要用一个线程池去执行,不要都堆在主线程里面做
  • 猪猪代购
    另外,可以试试保存成png格式,用CV_IMWRITE_PNG_COMPRESSION = 3.
  • i
    ipzh
    你们把楼主都说蒙了。

    这样吧,楼主你出点血,d版肯定有高手能解决。
  • 我好像是小号
    回复32#ipzh
    我把上面各位说的,都一一反馈给维护程序猿了。
    哎,我太难了iOS fly ~
  • l
    liuzhedash
    单线程肯定慢啊,opencv转换图片本来就耗cpu,先把要处理的图片路径读到一个Vector<String>里,然后起N个进程各拿一部分去处理。
  • i
    ipzh
    上面给你提了几个思路:

    1、Linux文件系统文件数量 的问题,文件太多,导致写入慢
    2、IO慢,可以考虑多线程或者异步方式解决
    3、写日志,加profile,看哪个地方执行耗时
    大家只能给你一个思路,具体的代码就是具体解决。
  • 我好像是小号
    单线程慢?百思不得其解的问题就是,如果我程序改成10张,就不会慢了。如果我设置成最多可以保存几百张或者几千几万张。那么就会越来越慢。但是总共保存10,超过10张就是删除最开始第一张,然后保存,如此循环。 如果设置成1000张,那就是超过1000张就是删除最开始第一张,然后保存,如此循环。
    好像都是单线程哎。
  • 我好像是小号
    回复30#猪猪代购
    亲爱的网友你好,刚刚程序猿把图片全部改成多线程保存了,果然就不会变了,但是程序猿表示不理解,用多线程为啥会快这么多,图片多也没有影响,他说他在Windows系统的时候从来不要用多线程这种方式要保存。 iOS fly ~
  • 我好像是小号
    回复34#liuzhedash
    亲爱的网友你好,刚刚程序猿把图片全部改成多线程保存了,果然就不会变了,但是程序猿表示不理解,用多线程为啥会快这么多,图片多也没有影响,他说他在Windows系统的时候从来不要用多线程这种方式要保存。 iOS fly ~
  • g
    gj91
    找人家干活给钱,上d版提问免费,是这个思路不…?
  • 猪猪代购
    回复37#我好像是小号

    猿不行
  • 我好像是小号
    回复40#猪猪代购
    人家也工作七八年的老程序猿了哈。他找不到原因,我就只能到处论坛QQ群啥发帖问,帮他寻找问题点
    一直兢兢业业帮俺维护程序iOS fly ~
  • 猪猪代购
    7-8年了,这点还没明白。真的不行
  • 我好像是小号
    回复42#猪猪代购
    大佬指点迷津一下,我去跟他说一下,让他也涨知识一下嘛 iOS fly ~
  • g
    gj91
    回复42#猪猪代购

    人家不行但能从楼主手上挣到钱,你行也只能被白嫖啊…人家拿你免费的去指导收费的,服气不…
  • 猪猪代购
    如果只保存文件,cpu是闲着的,瓶颈就是磁盘io速度。

    因为cv的保存还有图像压缩计算,cpu是跑满的了。

    所以,单线程只能用一个核,多线程用多个核一起压缩图片
  • 猪猪代购
    回复44#gj91

    哈哈,这些小活不值得挣的
  • 我好像是小号
    回复45#猪猪代购
    多谢,我明天去教育一下他
    印象中,他好像说也测试过用qt的方法保存图片,也是一样慢。 iOS fly ~
  • s
    smalltintin
    看破不说破,人生真谛
  • g
    gj91
    回复46#猪猪代购

    其实我最佩服的是这个程序员,水平不行还能忽悠甲方去替他找解决方案,特别厉害了…
  • 我好像是小号
    回复44#gj91
    人家可能技术差了一点,但是兼职工作态度很不错的,加班回来,晚上十点多了,还能帮忙改需求改到12点多,急的时候,可以早上六点爬起来,改到八点,然后去上班可以先改完需求,再谈钱。 iOS fly ~