У меня есть 3 огромных файла CSV, содержащих климатические данные, каждый около 5 ГБ. Первая ячейка в каждой строке - это номер метеостанции (от 0 до 100 000), каждая станция содержит от 1 до 800 строк в каждом файле, что не обязательно равно во всех файлах. Например, станция 11 имеет 600, 500 и 200 строк в файлах1, file2 и file3 соответственно. Я хочу прочитать все строки каждой станции, выполнить некоторые операции над ними, затем записать результаты в другой файл, затем следующую станцию и т. Д. Файлы слишком велики для загрузки сразу в памяти, поэтому Я пробовал некоторые решения читать их с минимальной нагрузкой памяти, как this post и this post, которые включают в себя этот метод:Чтение больших CSV-файлов из n-й строки в Python (не с самого начала)
with open(...) as f:
for line in f:
<do something with line>
проблема с этим способом, который считывает файл с самого начала каждый раз, когда я хочу, чтобы читать файлы следующим образом :
for station in range (100798):
with open (file1) as f1, open (file2) as f2, open (file3) as f3:
for line in f1:
st = line.split(",")[0]
if st == station:
<store this line for some analysis>
else:
break # break the for loop and go to read the next file
for line in f2:
...
<similar code to f1>
...
for line in f3:
...
<similar code to f1>
...
<do the analysis to station, the go to next station>
Проблема в том, что каждый раз, когда я начинаю считать следующую станцию, цикл for будет начинаться с начала, тогда как я хочу, чтобы он начинался с того места, где «Break» встречается в n-й строке, то есть для продолжения чтения файла.
Как я могу это сделать?
Заранее спасибо
Заметки о решениях ниже: Как я уже говорил ниже в то время я опубликовал свой ответ, я реализовал ответ @DerFaizio, но я нашел, что это очень медленно в обработке.
После того, как я попробовал генераторский ответ, представленный @ PM_2Ring, я нашел его очень быстрым. Может быть, потому что это зависит от генераторов.
Различия между двумя решениями можно заметить по количеству обрабатываемых станций за минуту , которые составляют 2500 ст/мин для решения на основе генератора, и 45 ст/мин для решения на основе Pandas. где Решение на базе генератора> в 55 раз быстрее.
Ниже приведены ссылки на ниже приведенные ниже описания. Большое спасибо всем участникам, особенно @ PM_2Ring.
можно сохранить позицию файла, используя 'f1.tell()' и стремиться вернуться к нему в следующий раз. –
Спасибо @ Jean-FrançoisFabre, но это занимает много времени, так как каждый файл содержит более 500 линий Milion. И, не сохраняя позицию file.tell(), я могу снова найти номер станции по мере сортировки. Еще раз спасибо за ваше предложение, но я думаю, что есть лучшее решение. –
проблема в том, что строки имеют переменный размер, поэтому для достижения линии N вам нужно пройти все предыдущие строки хотя бы один раз (и затем кэшировать результат). Удачи с этим. –