Прежде всего, 1 ГБ не является огромным - практически любое современное устройство может сохранить это в своей рабочей памяти. Во-вторых, pandas не позволяет вам ковыряться в CSV-файле, вы можете только указать, сколько данных «загрузить» - я бы предложил использовать встроенный модуль csv
, если вы хотите выполнить более сложную обработку CSV.
К сожалению, reader()
модуля csv
создаст исчерпывающий итератор для вашего файла, поэтому вы не можете просто построить его как простой цикл и ждать следующих строк стать доступным - вам придется собирать новые строки вручную, а затем подавать их для достижения желаемого эффекта, например:
import csv
import time
filename = "path/to/your/file.csv"
with open(filename, "rb") as f: # on Python 3.x use: open(filename, "r", newline="")
reader = csv.reader(f) # create a CSV reader
header = next(reader) # grab the first line and keep it as a header reference
print("CSV header: {}".format(header))
for row in reader: # iterate over the available rows
print("Processing row: {}".format(row)) # process each row however you want
# file exhausted, entering a 'waiting for new data' state where we manually read new lines
while True: # process ad infinitum...
reader = csv.reader(f.readlines()) # create a CSV reader for the new lines
for row in reader: # iterate over the new rows, if any
print("Processing new row: {}".format(row)) # process each row however you want
time.sleep(10) # wait 10 seconds before attempting again
Остерегайтесь крайних случаев, которые могут нарушить этот процесс - например, если вы попытаетесь прочитать новые строки по мере их добавления, некоторые данные могут быть потеряны / разделены (в зависимости от механизма очистки, используемого для добавления), если вы удалите предыдущие строки, которые читатель может испортить и т. д. Если это вообще возможно, я бы предложил контролировать процесс записи CSV таким образом, чтобы он явно информировал ваши процедуры обработки.
ОБНОВЛЕНИЕ : Вышеперечисленное обрабатывает файл CSV построчно, он никогда не загружается целиком в рабочую память. Единственная часть, которая на самом деле загружает более одной строки в памяти, - это когда происходит обновление файла, когда он собирает все новые строки, потому что быстрее обрабатывать их таким образом и, если вы не ожидаете миллионов строк обновлений между двумя проверки, влияние на память будет незначительным. Однако, если вы хотите, чтобы эта часть также обрабатывалась построчно, вот как это сделать:
import csv
import time
filename = "path/to/your/file.csv"
with open(filename, "rb") as f: # on Python 3.x use: open(filename, "r", newline="")
reader = csv.reader(f) # create a CSV reader
header = next(reader) # grab the first line and keep it as a header reference
print("CSV header: {}".format(header))
for row in reader: # iterate over the available rows
print("Processing row: {}".format(row)) # process each row however you want
# file exhausted, entering a 'waiting for new data' state where we manually read new lines
while True: # process ad infinitum...
line = f.readline() # collect the next line, if any available
if line.strip(): # new line found, we'll ignore empty lines too
row = next(csv.reader([line])) # load a line into a reader, parse it immediately
print("Processing new row: {}".format(row)) # process the row however you want
continue # avoid waiting before grabbing the next line
time.sleep(10) # wait 10 seconds before attempting again