Dataset、IterableDataset 读取大数据的思路
一、單進(jìn)程讀取數(shù)據(jù)
Dataset
在數(shù)據(jù)量很大,無(wú)法將全部數(shù)據(jù)加載到內(nèi)存的情況下,可以在init中讀出表數(shù)據(jù)行數(shù),在__len__設(shè)置為長(zhǎng)度返回,在__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都從文件或者表中讀出來(lái),知道數(shù)據(jù)的長(zhǎng)度,為了生成index列表,長(zhǎng)度為數(shù)據(jù)的長(zhǎng)度 分batch訓(xùn)練的時(shí)候,dataloader根據(jù)分好的一個(gè)batch中的idx來(lái)讀取這個(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ù)量很大,無(wú)法將全部數(shù)據(jù)加載到內(nèi)存的情況下,可以在__iter__中一行一行的讀表,讀一行就立馬返回一行。
import torch import numpy as np from torch.utils.data import IterableDataset, Dataset ''' 不需要一次性知道數(shù)據(jù)長(zhǎng)度 分batch訓(xùn)練的時(shí)候,dataloader根據(jù)一個(gè)batch的大小bs來(lái)執(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 读取大数据的思路的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【数据挖掘】挖掘建模-回归分析(1)
- 下一篇: 如何使用ListView实现一个带有网络