Maybe this would be safer:
def __len__(self): 
    return min(len(self.dataP), len(self.dataC))

Otherwise you could have out of range errors if the len(self.dataP) > len(self.dataC). The drawback of this method is that it could skip a lot of training data. Are you datasets aligned ? i.e., the 10th sample of dataP must be trained together with the 10th sample of dataC ?