日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dataset、IterableDataset 读取大数据的思路

發(fā)布時(shí)間:2024/7/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dataset、IterableDataset 读取大数据的思路 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、單進(jìn)程讀取數(shù)據(jù)

Dataset

在數(shù)據(jù)量很大,無法將全部數(shù)據(jù)加載到內(nèi)存的情況下,可以在init中讀出表數(shù)據(jù)行數(shù),在__len__設(shè)置為長度返回,在__getitem__中根據(jù)idx讀表,idx就可以表示讀取的表的行數(shù),一般在讀表的時(shí)候?qū)懽?path/table_name?start={}&end={}

import torch import numpy as np from torch.utils.data import IterableDataset, Dataset''' 需要先一次性把data都從文件或者表中讀出來,知道數(shù)據(jù)的長度,為了生成index列表,長度為數(shù)據(jù)的長度 分batch訓(xùn)練的時(shí)候,dataloader根據(jù)分好的一個(gè)batch中的idx來讀取這個(gè)batch中的數(shù)據(jù) '''a = [{'anchor_text': np.array([1, 1, 1]), 'anchor_vis': np.array([1, 1, 1])},{'anchor_text': np.array([2, 2, 1]), 'anchor_vis': np.array([4, 1, 1])},{'anchor_text': np.array([3, 3, 1]), 'anchor_vis': np.array([2, 1, 1])},{'anchor_text': np.array([4, 4, 1]), 'anchor_vis': np.array([3, 1, 1])}]class TableDataset(Dataset):def __init__(self):self.tablepath = ''self.data_length = len(a)def __len__(self):return self.data_lengthdef __getitem__(self, idx):return a[idx]train_dataset = TableDataset() train_ld = torch.utils.data.DataLoader(train_dataset, batch_size=2, shuffle=False)for idx, batch_data in enumerate(train_ld):print(batch_data)at = batch_data['anchor_text'].to(torch.float32)# print("at--------",at)

IterableDataset

在數(shù)據(jù)量很大,無法將全部數(shù)據(jù)加載到內(nèi)存的情況下,可以在__iter__中一行一行的讀表,讀一行就立馬返回一行。

import torch import numpy as np from torch.utils.data import IterableDataset, Dataset ''' 不需要一次性知道數(shù)據(jù)長度 分batch訓(xùn)練的時(shí)候,dataloader根據(jù)一個(gè)batch的大小bs來執(zhí)行__iter__函數(shù)bs次,得到這個(gè)batch的數(shù)據(jù) '''a = [{'anchor_text': np.array([1, 1, 1]), 'anchor_vis': np.array([1, 1, 1])},{'anchor_text': np.array([2, 2, 1]), 'anchor_vis': np.array([4, 1, 1])},{'anchor_text': np.array([3, 3, 1]), 'anchor_vis': np.array([2, 1, 1])},{'anchor_text': np.array([4, 4, 1]), 'anchor_vis': np.array([3, 1, 1])}]class TableDataset2(IterableDataset):def __init__(self):self.tablepath = ''def __iter__(self):for line in a:print("line:",line)yield linetrain_dataset = TableDataset2() train_ld = torch.utils.data.DataLoader(train_dataset, batch_size=2, shuffle=False)for idx, batch_data in enumerate(train_ld):print(batch_data)at = batch_data['anchor_text'].to(torch.float32)# print("at--------",at)

上述提到的處理數(shù)據(jù)量大的方法,都需要提前將數(shù)據(jù)處理好存入表中,程序讀取數(shù)據(jù)就可以直接跑模型了。

二、多進(jìn)程讀取數(shù)據(jù)

后續(xù)有時(shí)間再補(bǔ)上

IterableDataset

當(dāng)DataLoader設(shè)置為多進(jìn)程時(shí),每個(gè)進(jìn)程都會(huì)擁有一個(gè)IterableDataset的生成器函數(shù)__iter__,每當(dāng)這個(gè)進(jìn)程收集到的數(shù)據(jù)達(dá)到batch size的時(shí)候,就把這批收集到的數(shù)據(jù)給loader,也就在for batch_data in train_loader: 的時(shí)候就能得到這批數(shù)據(jù)。

總結(jié)

以上是生活随笔為你收集整理的Dataset、IterableDataset 读取大数据的思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。