• OSError: [WinError 1455] 页面文件太小,无法完成操作


    最近测试一个python脚本,为了避免GPU抢占的问题,程序全部使用了CPU模式,即使用参数 “--gpu_ids -1”运行。

    测试发现:

    进程运行,程序无问题。

    线程运行,程序无问题,但是采用多线程的时候,程序变得不稳定,具体表现为:

    当使用3个及以下线程时,程序正常运行。

    当使用4个线程时,部分出错,但是一旦出错之后,后面全部出错。

    当使用超过4个线程时,全部出错。

    出错界面如下:

     网上搜索这个错误,一般说增加虚拟内存资源即可解决问题,但是根据我的亲自测试,这个方法无效,增加了程序所在的盘的虚拟内存自动管理,问题依旧。

    以下,贴出模块代码:

    1. //author:autumoon
    2. //mail:9506#163.com
    3. //日期:2022-09-15
    4. from argparse import ArgumentParser
    5. import utils
    6. import torch
    7. from models.basic_model import CDEvaluator
    8. import os
    9. """
    10. quick start
    11. sample files in ./samples
    12. save prediction files in the ./samples/predict
    13. """
    14. def get_args():
    15. # ------------
    16. # args
    17. # ------------
    18. parser = ArgumentParser()
    19. #autumoon
    20. # parser.add_argument('--imgpathA', default='', type=str)
    21. # parser.add_argument('--imgpathB', default='', type=str)
    22. # parser.add_argument('--imgPathDst', default='', type=str)
    23. parser.add_argument('--imgPathA', default='D:\\Personal\\Desktop\\A.tif', type=str)
    24. parser.add_argument('--imgPathB', default='D:\\Personal\\Desktop\\B.tif', type=str)
    25. parser.add_argument('--project_name', default='BIT_LEVIR', type=str)
    26. parser.add_argument('--gpu_ids', type=str, default='0', help='gpu ids: e.g. 0 0,1,2, 0,2. use -1 for CPU')
    27. parser.add_argument('--checkpoint_root', default='checkpoints', type=str)
    28. parser.add_argument('--output_folder', default='D:\\Personal\\Desktop\\', type=str)
    29. # data
    30. parser.add_argument('--num_workers', default=0, type=int)
    31. parser.add_argument('--dataset', default='user_input', type=str)
    32. parser.add_argument('--data_name', default='user_name', type=str)
    33. parser.add_argument('--batch_size', default=1, type=int)
    34. parser.add_argument('--split', default="user", type=str)
    35. parser.add_argument('--img_size', default=256, type=int)
    36. # model
    37. parser.add_argument('--n_class', default=2, type=int)
    38. parser.add_argument('--net_G', default='base_transformer_pos_s4_dd8_dedim8', type=str,
    39. help='base_resnet18 | base_transformer_pos_s4_dd8 | base_transformer_pos_s4_dd8_dedim8|')
    40. parser.add_argument('--checkpoint_name', default='best_ckpt.pt', type=str)
    41. args = parser.parse_args()
    42. return args
    43. if __name__ == '__main__':
    44. args = get_args()
    45. utils.get_device(args)
    46. device = torch.device("cuda:%s" % args.gpu_ids[0]
    47. if torch.cuda.is_available() and len(args.gpu_ids)>0
    48. else "cpu")
    49. args.checkpoint_dir = os.path.join(args.checkpoint_root, args.project_name)
    50. os.makedirs(args.output_folder, exist_ok=True)
    51. log_path = os.path.join(args.output_folder, 'log_vis.txt')
    52. data_loader = utils.get_loader(args.data_name, img_size=args.img_size,
    53. batch_size=args.batch_size,
    54. split=args.split, is_train=False,
    55. dataset='MyDataset', imgPathA=args.imgPathA, imgPathB=args.imgPathB)
    56. model = CDEvaluator(args)
    57. model.load_checkpoint(args.checkpoint_name)
    58. model.eval()
    59. #only predict one group
    60. assert (data_loader.batch_size == 1)
    61. for i, batch in enumerate(data_loader):
    62. name = batch['name']
    63. print('process: %s' % name)
    64. score_map = model._forward_pass(batch)
    65. model._save_predictions()

    因为个人电脑配置较高,实测过程中内存的占用率都很低,平均20%以下,总虚拟内存设置也达到18G左右,CPU占用率也不高,平均40%以下,所以怀疑不是配置问题。

    个人想到一个办法,如果将python程序封装为exe,是不是就可以保证各线程独立了呢,于是将python程序封装为exe,一番调试之后,问题没有任何变化,之前问题什么样的,现在问题依旧。

     本次出错信息如下:

    OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "D:\MyItems\CDMatrix\install\bin\debug\inference_cd\torch\lib\cudnn_adv_infer64_8.dll" or one of its dependencies.
    

    发现,封装python,没有任何帮助,后台可以查看到,封装的本质仍然是调用了python.exe对脚本进行解释。

    目前,从错误提示看,或跟虚拟内存有关,或者跟cudnn有关,但问题暂时不知如何解决。

    目前暂时使用“OSError: [WinError 1455]页面文件太小,无法完成操作”解决了问题,但是不知道为何。

    不知道各位大佬,有谁可以帮忙指点一二,在此谢过。

  • 相关阅读:
    SpringBoot 实体参数(用于请求参数比较多时使用)
    Android自动化测试中使用ADB进行网络状态管理!
    拆解现货黄金隔夜利息计算公式
    Linux结构目录说明以及相关作用【重点】
    信息系统的生命周期 与 ITSS(信息技术服务标准)定义的IT服务生命周期
    精准防疫有“利器”| 芯讯通助力数字哨兵护航复市
    FastestDet为arm而生
    数字化校园包括哪些内容呢,应该从何入手?_光点科技
    12.1.5 将查询结果插入另一个表中
    深入学习Linux中的“文件系统和日志分析”
  • 原文地址:https://blog.csdn.net/autumoonchina/article/details/126873859