(self, item)
| 107 | |
| 108 | |
| 109 | def add(self, item): |
| 110 | if self.shard_file is None: |
| 111 | self.create_new_shard() |
| 112 | buffer = io.BytesIO() |
| 113 | torch.save(item, buffer) |
| 114 | bytes_view = buffer.getbuffer() |
| 115 | self.shard_file.write(bytes_view) |
| 116 | |
| 117 | # update items metadata |
| 118 | item = (self.shard, self.shard_index) |
| 119 | self.items.append(item) |
| 120 | self.con.execute('INSERT INTO items VALUES(?, ?)', item) |
| 121 | self.shard_index += 1 |
| 122 | |
| 123 | # update shard metadata |
| 124 | size = len(bytes_view) |
| 125 | entry = (self.offset, size) |
| 126 | self.shard_metadata[self.shard].append(entry) |
| 127 | self.con.execute(f'INSERT INTO {self.shard_table} VALUES (?, ?)', entry) |
| 128 | self.offset += size |
| 129 | |
| 130 | # create new shard when existing one is large enough |
| 131 | current_size_gb = self.shard_file.tell() / 1_000_000_000 |
| 132 | if current_size_gb >= self.shard_size_gb: |
| 133 | self.finalize_current_shard() |
| 134 | |
| 135 | |
| 136 | # for testing |
no test coverage detected