es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo leer una página iterable por página?

He intentado varias cosas para poder leer elementos página por página sin cargar cada página en una lista y devolver eso, lo que podría ocupar demasiada memoria en páginas grandes. Me gustaría evitar obtener una gran lista de elementos solo para tener que examinar la lista nuevamente para hacer el procesamiento posterior de cada elemento.

Entonces, o bien obtengo generadores que seguirán devolviendo datos vacíos y llenarán la lista pages con un número infinito de listas vacías (cuando se usa page_from_iterable2), o simplemente obtengo la primera página (como en page_from_iterable1).

¿Algún consejo sobre lo que estoy haciendo mal?

Gracias.

from typing import Iterable, Iterator


def read_paginated_items(
    it: Iterator,
    page_size: int,
) -> Iterable:
    for _ in range(page_size):
        try:
            yield next(it)
        except StopIteration:
            return


def page_from_iterable1(
    iterable: Iterable,
    page_size: int,
) -> Iterable:
    it = iter(iterable)
    page_items_generator = read_paginated_items(it, page_size)
    yield page_items_generator


def page_from_iterable2(
    iterable: Iterable,
    page_size: int,
) -> Iterable:
    it = iter(iterable)
    while page_items_generator := read_paginated_items(it, page_size):
        yield page_items_generator


def test_read_by_page():
    pages = []
    for page in page_from_iterable1([1, 2, 3, 4, 5], 2):
        page_items = [item for item in page]
        pages.append(page_items)

    assert pages == [[1, 2], [2, 3], [5]]
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando leer elementos página por página desde un iterador sin cargar la lista completa en la memoria. Tienes dos opciones:

    1. page_from_iterable1: Esto devolverá la primera página de elementos, pero no seguirá devolviendo más páginas.
    2. page_from_iterable2: Esto devolverá una cantidad infinita de listas vacías, ya que seguirá intentando leer elementos del iterador hasta llegar al final.

    Parece que necesitas utilizar page_from_iterable1 para obtener el resultado deseado.

Comments are closed.