У меня есть очередь, в которую один поток помещает в нее файлы, и эти элементы потребляются с помощью __getitem__ по фреймворку.
вот мой код:
Код: Выделить всё
import glob
import time
from torch.utils.data import DataLoader, Dataset
import threading
import queue
class CustomDataset(Dataset):
size = 25
def __init__(self):
self.voices_path = "/home/hatef/mmm/data/voice/"
file_list = glob.glob(self.voices_path + "*")
self.data = []
for f in file_list:
self.data.append(f)
self.q = queue.Queue(CustomDataset.size)
def fill_queue(self):
dataz = self.data
it = 0
while it < len(dataz):
path = dataz[it]
if not self.q.full():
with open(path,"rb") as f:
self.q.put(f.read())
it += 1
else:
print("queue size: " + str(self.q.qsize()))
time.sleep(2)
def __len__(self):
return len(self.data)
def __getitem__(self, _):
print("before get item")
item = self.q.get()
self.q.task_done()
return [item, 1]
params = {'batch_size': 16,
'shuffle': True,
'num_workers': 4}
epoch = 100
dataset = CustomDataset()
training_generator = DataLoader(dataset, **params)
producer = threading.Thread(target=dataset.fill_queue, daemon=True)
producer.start()
start_time = time.time()
for i in range(epoch):
for f in training_generator:
print(f)
print("............")
print(f"**********************************run epoch***************************************: {i}")
# time.sleep(10)
end_time = time.time()
execution_time = end_time - start_time
print(f"Execution time: {execution_time} seconds")
Код: Выделить всё
__getitem__
Подробнее здесь: https://stackoverflow.com/questions/787 ... -it-stucks