Wpis z mikrobloga

Potrzebuję przeczytać bardzo długi plik csv (około 20 milionów linijek). Wiadomo, zajmuje to trochę czasu, dlatego zamiast czytać wszystkie linijki na raz to chciałem sobie czytać po około 2 tys. linijek. Zastanawiam się tylko czy jest jakiś sposób na czytanie plików od pewnego momentu (linijki)? Albo w jaki inny sposób powinienem podejść do tego problemu?
#python #programowanie
  • 23
@asciiterror: akurat nie mam problemu z czytaniem linia po linii. Większy mam problem z tym żeby rozpocząć czytanie od jakiejś konkretnej linijki, bo nie chcę znów czytać tego samego żeby dopiero po tym przejść do nowych danych.

@less_is_more: Na pewno? Wydaje mi się, że niekoniecznie. Mógłbym przecież pokazywać tylko część wykresu i doczytywać dane jeśli użytkownik chciał zobaczyć inną część danych. Dane wyglądają w ten sposób, gdzie pierwsza wartość to
Pobierz S.....o - @asciiterror: akurat nie mam problemu z czytaniem linia po linii. Większy m...
źródło: comment_MSvS3T1rvkXWn7YZdx9FfpZHL7DjCy3h.jpg
@less_is_more: Powiedzmy, że wstępnie chciałbym przerywać czytanie co 2000 linijek. Wtedy wykres zostaje wykreślony i użytkownik może zadecydować, czy chce przeczytać kolejne 2000 próbek, czy może poprzednie 2000, a może 2000 próbek z jakiegoś dalszego momentu. W jednym momencie chciałbym przetrzymywać tylko te 2000 próbek.
Rozumiem, że przeniesienie do bazy danych będzie działać w ten sposób, że pierwsze przepisanie wszystkich danych do bazy zajmie sporo czasu, ale kolejne będą szybsze i
@asciiterror: Szczerze mówiąc to zależy mi na zmniejszeniu potrzebnej pamięci na przechowanie tego wszystkiego, bo tak jak pisałem wcześniej zajmuje mi to prawie 3GB RAM-u, a do tego długo się wczytuje co jest niewygodne.
Rozumiem, że przeniesienie do bazy danych będzie działać w ten sposób, że pierwsze przepisanie wszystkich danych do bazy zajmie sporo czasu, ale kolejne będą szybsze i będę mógł określić jaki zakres danych chcę czytać? Jak z pamięcią RAM w takim wypadku? Bo na chwilę obecną to przez wczytywanie całości do pamięci zajmuje mi to jakieś ~3GB.


@SpacePotato: No o to chodzi w bazach danych. 20M czystego tekstu to sporo, ale na
@SpacePotato: wczytujesz to do zwykłej pythonowej listy? Każda pythonowa wartość ma spory narzut (liczba referencji, typ zmiennej, wielkość i dopiero wartość - powiedzmy 32B zamiast 8B dla inta.) Jakbyś użył np. Pandas zużycie pamięci powinno ci spaść na oko 4 razy.

To co podałem powinno działać, tylko musiałbyś mieć z góry obliczone offsety każdej porcji 2000 linii.
edit. dla zainteresowanych: pythonowy int w C wygląda mniej więcej tak:

struct _longobject {