У меня есть большой файл (30GB +) CSV, где я подсчитываю количество новых строк, анализируя блок файла по блоку
Используя следующую функцию
def yieldblocks(file, size=1024*1024):
while True:
blocks = file.read(size)
if not blocks: break
yield blocks
И вызывая ее так,
sum(bl.count("\n") for bl in blocks(txtfile))
Я могу посчитать переводы строки чуть менее чем за час (я удивлен, что это лучшее, что я мог получить тоже)
Моя проблема в том, что мне нужно пропустить новые строкив двойных кавычках, так как некоторые столбцы содержат многострочное содержимое.
Я пробовал описанное ниже, но оно не работает, и процесс завершается без результатов
sum(.5 if re.search('^[^"]*"(?=[^"]*(?:"[^"]*")*[^"]*$).*$', bl) else 1 for bl in yieldblocks(txtfile))
Регулярное выражение состоит в нахождении нечетногоколичество символов в двойных кавычках в одной строке и работает в файле небольшого размера.
Я на 2 ГБ оперативной памяти, 32-разрядная ОС
Примечание: я пробовал модуль CSV, но его медленнее по сравнениючтобы считать по блокам и надеялся, что смогу как-то заставить это работать