lazy_map:C++中std::unordered_map的高效实现

需积分: 10 0 下载量 25 浏览量 更新于2024-12-16 收藏 7KB ZIP 举报
资源摘要信息: "lazy_map 是一个 C++ 中的模板类,它实现了类似于 std::unordered_map 的功能,但是在复制操作上具有显著的不同。std::unordered_map 是 C++ 标准库中的一个模板类,提供了无序键值对的容器,其主要特点是底层使用哈希表实现,因此具有平均常数时间复杂度的操作性能。 lazy_map 的复制成本为 O(1),这意味着复制一个 lazy_map 对象是极其高效的,不会随着容器中元素数量的增加而增加复制时间。这种优化的核心在于 lazy_map 在复制时不进行深度复制,而可能仅复制引用或指针,从而达到复制成本为 O(1) 的效果。这与 std::unordered_map 在复制时要复制所有元素的深度复制方式形成对比。 值得注意的是,虽然复制操作成本低,但这种实现并不会对 map 接口的其他操作产生副作用,即除了复制操作之外的插入、删除、查找等操作,其时间复杂度仍然是 O(1),保持了与 std::unordered_map 类似的性能特点。 在使用 lazy_map 时,需要注意的是,由于其复制操作的特殊性,迭代器在任何标准的写操作中都可能失效。这一点与 std::unordered_map 有所不同,后者保证在擦除操作之外的写操作时迭代器仍然有效。因此,使用 lazy_map 的客户端必须意识到在进行例如插入、删除等操作时,原有的迭代器可能无法继续使用,需要重新获取。 lazy_map 还提供了一些非标准的方法来处理元素值,例如 move_value 和 move 方法。这些方法允许用户将键对应的值移动出去,而不影响 lazy_map 对象本身。这样的设计允许更灵活的资源管理,尤其是在涉及到大对象的移动操作时,可以提高效率,减少不必要的复制。 尽管提供了高效的复制操作,lazy_map 的设计也意味着两个独立的 lazy_map 对象之间不会相互影响。对一个对象进行的写操作不会反映到另一个对象上,保持了对象的独立性。 总的来说,lazy_map 为 C++ 开发者提供了一个有趣的选择,特别是在需要高效复制操作的场景中,比如对象池、快速初始化大量对象等情况下。开发者在选择使用 lazy_map 时应该仔细考虑其特性和限制,确保它适合自己的应用场景。"

Traceback (most recent call last): File "DT_001_X01_P01.py", line 150, in DT_001_X01_P01.Module.load_model File "/home/kejia/Server/tf/Bin_x64/DeepLearning/DL_Lib_02/mmdet/apis/inference.py", line 42, in init_detector checkpoint = load_checkpoint(model, checkpoint, map_location=map_loc) File "/home/kejia/Server/tf/Bin_x64/DeepLearning/DL_Lib_02/mmcv/runner/checkpoint.py", line 529, in load_checkpoint checkpoint = _load_checkpoint(filename, map_location, logger) File "/home/kejia/Server/tf/Bin_x64/DeepLearning/DL_Lib_02/mmcv/runner/checkpoint.py", line 467, in _load_checkpoint return CheckpointLoader.load_checkpoint(filename, map_location, logger) File "/home/kejia/Server/tf/Bin_x64/DeepLearning/DL_Lib_02/mmcv/runner/checkpoint.py", line 244, in load_checkpoint return checkpoint_loader(filename, map_location) File "/home/kejia/Server/tf/Bin_x64/DeepLearning/DL_Lib_02/mmcv/runner/checkpoint.py", line 261, in load_from_local checkpoint = torch.load(filename, map_location=map_location) File "torch/serialization.py", line 594, in load return _load(opened_zipfile, map_location, pickle_module, **pickle_load_args) File "torch/serialization.py", line 853, in _load result = unpickler.load() File "torch/serialization.py", line 845, in persistent_load load_tensor(data_type, size, key, _maybe_decode_ascii(location)) File "torch/serialization.py", line 834, in load_tensor loaded_storages[key] = restore_location(storage, location) File "torch/serialization.py", line 175, in default_restore_location result = fn(storage, location) File "torch/serialization.py", line 157, in _cuda_deserialize return obj.cuda(device) File "torch/_utils.py", line 71, in _cuda with torch.cuda.device(device): File "torch/cuda/__init__.py", line 225, in __enter__ self.prev_idx = torch._C._cuda_getDevice() File "torch/cuda/__init__.py", line 164, in _lazy_init "Cannot re-initialize CUDA in forked subprocess. " + msg) RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method ('异常抛出', None) DT_001_X01_P01 load_model ret=1, version=V1.0.0.0

2023-07-22 上传