import functools
import tempfile
import threading
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path
from dataloader_rs import FileDataset, ObjectStoreDataset, PyDataloader
FOLDERS = ["cats", "cats", "cats", "dogs", "dogs", "dogs"]
def to_text(index: int, data: bytes) -> str:
return data.decode()
class QuietHandler(SimpleHTTPRequestHandler):
def log_message(self, format: str, *args: object) -> None:
pass
def main() -> None:
with tempfile.TemporaryDirectory() as tmp:
root = Path(tmp)
for index, folder in enumerate(FOLDERS):
(root / folder).mkdir(exist_ok=True)
(root / folder / f"{index}.txt").write_text(f"{folder} #{index}")
template = str(root).replace("{", "{{").replace("}", "}}") + "/{folder}/{index}.txt"
files = FileDataset.from_template(
template,
{"folder": FOLDERS},
timeout=10.0, retries=2, )
loader = PyDataloader(files, batch_size=3, item_concurrency=3, transform=to_text)
for batch in loader:
print("files: ", batch)
handler = functools.partial(QuietHandler, directory=tmp)
server = ThreadingHTTPServer(("127.0.0.1", 0), handler)
threading.Thread(target=server.serve_forever, daemon=True).start()
try:
objects = ObjectStoreDataset(
f"http://127.0.0.1:{server.server_port}/dogs",
keys=["3.txt", "4.txt", "5.txt"], options={"allow_http": "true"}, retries=3, )
loader = PyDataloader(objects, batch_size=3, num_workers=1, transform=to_text)
for batch in loader:
print("objects:", batch)
finally:
server.shutdown()
server.server_close()
if __name__ == "__main__":
main()