Как работать с большими файлами в режиме непрерывного чтения?
Доброго времени суток!
Есть некая программа, которая пишет некоторые данные в файл. Допустим, известен только формат строки (например, "время записи;число;число;число"), т.е. длина строки не фиксирована. Эта программа записывает данные не в постоянные интервалы времени, запись может производиться как раз в секунду, так и раз в 10 секунд. Моя задача - это считывать данные с этого файла и заносить их в базу. Как это вообще реализовать? Файл может быть больших размеров, я должен записывать только новые данные, те, что уже записал - не учитывать. При запуске моей программы, с файла должны быть считаны и записаны в БД строки, которые еще не были записаны. В какую сторону копать? Пока что не представляю, как это можно воплотить в жизнь.
В линуксе есть tail -f. Можно посмотреть как это реализовано там и сделать аналогично, либо запускать вашу программу tail -f /path/to/file | myprogram и читать из stdin строки и писать в базу.
В винде, мне кажется, стоит копать в сторону fseek(). Например хранить дату последнего сообщения, и через fseek читать последние 5-10% файла и заносить только новые записи. Коряво, но будет работать.
Копайте в сторону индексирования. Разделяйте на несколько файлов по времени записи, например.
Или храните "время записи -> оффсет внутри файла" где-нибудь отдельно.
Да даже можно использовать пайпы какие-нибудь - пусть данные записываются одновременно(или по очереди) в файл и в ваше приложение.
Ну и ничего страшного в большом размере файла нет. В вашем случае необходимо же считывать только последние записи - т.е. не весь файл, а только его конец.