class_docstr: Abstract class for defining data reader. All other media readers use this
  abstract class. Media readers are expected to return Batch
  in an iterative manner.
  
  Attributes:
      file_url (str): path to read data from
class_docstr_tok: ["Abstract","class","for","defining","data","reader",".","All","other","media","readers","use","this","abstract","class",".","Media","readers","are","expected","to","return","Batch","in","an","iterative","manner",".","Attributes",":","file_url","(","str",")",":","path","to","read","data","from"]
docstr: This calls the sub class read implementation and
  yields the batch to the caller
docstr_tok: ["This","calls","the","sub","class","read","implementation","and","yields","the","batch","to","the","caller"]
code: def read(self) -> Iterator[Batch]:
      """
      This calls the sub class read implementation and
      yields the batch to the caller
      """
  
      data_batch = []
      row_size = None
      for data in self._read():
          if row_size is None:
              row_size = 0
              row_size = get_size(data)
          data_batch.append(data)
          if len(data_batch) * row_size >= self.batch_mem_size:
              yield Batch(pd.DataFrame(data_batch))
              data_batch = []
      if data_batch:
          yield Batch(pd.DataFrame(data_batch))
  
file_path: evadb/evadb/readers/abstract_reader.py
imports: from abc import ABCMeta, abstractmethod
  from pathlib import Path
  from typing import Dict, Iterator
  import pandas
  from evadb.models.storage.batch import Batch
  from evadb.utils.errors import DatasetFileNotFoundError
  from evadb.utils.generic_utils import get_size
label_desc: Use image node_id 2 for calling the AbstractReader obj's underlying member method code with example usage: obj.read() without return types