共享内存和Pytorch中的Dataloader结合

dataloader中通常使用num_workers来指定多线程来进行数据的读取。可以使用共享内存进行加速。

代码地址:https://github.com/POSTECH-CVLab/point-transformer/blob/master/util/s3dis.py

文章目录

    • [1. 共享内存和dataloader结合](#1. 共享内存和dataloader结合)
      • [1.1 在init中把所有的data存储到共享内存中](#1.1 在init中把所有的data存储到共享内存中)
      • [1.2 在getitem从共享内存中读出data](#1.2 在getitem从共享内存中读出data)
    • [2. 怎么查询key在不在共享内存中](#2. 怎么查询key在不在共享内存中)
    • [3. 共享内存的地址是什么,怎么查看](#3. 共享内存的地址是什么,怎么查看)
    • [4. 共享内存有多大](#4. 共享内存有多大)
    • [5. 共享怎么删除](#5. 共享怎么删除)

1. 共享内存和dataloader结合

复制代码
class S3DIS(Dataset):
    def __init__(self, split='train', data_root='trainval', test_area=5, voxel_size=0.04, voxel_max=None, transform=None, shuffle_index=False, loop=1):
        super().__init__()
        self.split, self.voxel_size, self.transform, self.voxel_max, self.shuffle_index, self.loop = split, voxel_size, transform, voxel_max, shuffle_index, loop
        data_list = sorted(os.listdir(data_root))
        data_list = [item[:-4] for item in data_list if 'Area_' in item]
        if split == 'train':
            self.data_list = [item for item in data_list if not 'Area_{}'.format(test_area) in item]
        else:
            self.data_list = [item for item in data_list if 'Area_{}'.format(test_area) in item]
        for item in self.data_list:
            if not os.path.exists("/dev/shm/{}".format(item)):
                data_path = os.path.join(data_root, item + '.npy')
                data = np.load(data_path)  # xyzrgbl, N*7
                sa_create("shm://{}".format(item), data)
        self.data_idx = np.arange(len(self.data_list))
        print("Totally {} samples in {} set.".format(len(self.data_idx), split))

    def __getitem__(self, idx):
        data_idx = self.data_idx[idx % len(self.data_idx)]
        data = SA.attach("shm://{}".format(self.data_list[data_idx])).copy()
        coord, feat, label = data[:, 0:3], data[:, 3:6], data[:, 6]
        coord, feat, label = data_prepare(coord, feat, label, self.split, self.voxel_size, self.voxel_max, self.transform, self.shuffle_index)
        return coord, feat, label

    def __len__(self):
        return len(self.data_idx) * self.loop

1.1 在init中把所有的data存储到共享内存中

复制代码
for item in self.data_list:
    if not os.path.exists("/dev/shm/{}".format(item)):
        data_path = os.path.join(data_root, item + '.npy')
        data = np.load(data_path)  # xyzrgbl, N*7
        sa_create("shm://{}".format(item), data)

key就是文件名,存储在self.data_list中

1.2 在getitem从共享内存中读出data

复制代码
data = SA.attach("shm://{}".format(self.data_list[data_idx])).copy()

2. 怎么查询key在不在共享内存中

os.path.exists("/dev/shm/{}".format(item))能够查询该key在不在共享内存中。

3. 共享内存的地址是什么,怎么查看

复制代码
$ ls /dev/shm  
Area_5_hallway

通过/dev/shm地址访问,但是这部分数据存储在内存中。

4. 共享内存有多大

复制代码
$ df -h   
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           7.8G   44M  7.8G   1% /dev/shm

大小是物理内存的一半

5. 共享怎么删除

复制代码
SA.delete("shm://{}".format('Area_5_hallway'))

SA.delete删除key

相关推荐
智驱力人工智能33 分钟前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
人工不智能57739 分钟前
拆解 BERT:Output 中的 Hidden States 到底藏了什么秘密?
人工智能·深度学习·bert
猫头虎44 分钟前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
h64648564h1 小时前
CANN 性能剖析与调优全指南:从 Profiling 到 Kernel 级优化
人工智能·深度学习
心疼你的一切1 小时前
解密CANN仓库:AIGC的算力底座、关键应用与API实战解析
数据仓库·深度学习·aigc·cann
八零后琐话1 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
光泽雨2 小时前
检测阈值 匹配阈值分析 金字塔
图像处理·人工智能·计算机视觉·机器视觉·smart3
青春不朽5122 小时前
Scrapy框架入门指南
python·scrapy
sali-tec2 小时前
C# 基于OpenCv的视觉工作流-章22-Harris角点
图像处理·人工智能·opencv·算法·计算机视觉