Asynchronicznie pobieranie dużego pliku

0

Mam dużą ilość danych którą muszę pobrać(kilka milionów wierszy) i nie chcę tych danych wrzucać do pamięci.
Doszedłem do etapu gdzie wrzucam te dane do pliku, jednak nie wiem jak ten plik pobrać, bądź od razu strumieniować dane
do csv. Używam do libek async: Quart i aioinflux. Moja wiedza o Pythonie jest bardzo mała. Co dotąd mi się udało zrobić:

import pandas as pd

from quart import Quart
from aioinflux import InfluxDBClient

app = Quart(__name__)

@app.route("/to_csv", methods=['GET'])
async def get_csv():

    async with InfluxDBClient(db='test') as client:
        query = "SELECT value ..."
        resp = await client.query(query, chunked=True, chunk_size=10000)

        async for row in resp:
            df = pd.DataFrame.from_dict(row)
            df.to_csv('file.csv', mode='a', header=False)

if __name__ == "__main__":
    app.run()

Macie jakies wskazówki w którą strone iść bądź jak to sensownie dokończyć?

2

@Seme: Coś znalezione w głębinach internetu: https://www.kite.com/python/answers/how-to-read-a-text-file-from-a-url-in-python

url = "http://textfiles.com/adventure/aencounter.txt"
file = urllib.request.urlopen(url)

for line in file:
	decoded_line = line.decode("utf-8")
	print(decoded_line)

Może pomoże?

Pozdrawiam

1

@Radosław Głębicki: dzięki, jednak poradziłem sobie z własną implementacją.

Wysyłam kod wynikowy, który mniej więcej spełnia moje założenia

from quart import Quart
from aioinflux import InfluxDBClient

app = Quart(__name__)

@app.route("/to_csv", methods=['GET'])
async def get_csv():

    async with InfluxDBClient(db='test') as client:
        query = "SELECT value ..."
		
		async def generate_rows():
			resp = await client.query(query, chunked=True, chunk_size=10000)
			async for row in resp:
				r= row... #mapowanie
				yield r.encode('utf-8')
		
		return generate_rows(), {
            'Content-Type': 'text/csv',
            'Content-Disposition': 'attachment; filename="file.csv"'
        }

if __name__ == "__main__":
    app.run()

1

Wcinam się do już rozwiązanego problemu, ale warto dodać komentarz, dlaczego to teraz działa, a wcześniej nie działało. Z kodu wynika, że rozwiązaniem problemu było zastosowanie generatora (słowo kluczowe yield). Też poznaję teraz trochę bardziej pythona i w zasadzie generatory służą do rozwiązywania tego typu problemów, bo dane nie są wypluwane w momencie tworzenia definicji funkcji, tylko w momencie jej wywołania, a w tym przypadku w momencie odczytu pojedynczego rekordu. Bez generatora zrzucałeś całą tabelę hurtem na raz do pamięci.

1 użytkowników online, w tym zalogowanych: 0, gości: 1