Как работать с большими файлами в режиме непрерывного чтения?

Доброго времени суток!

Есть некая программа, которая пишет некоторые данные в файл. Допустим, известен только формат строки (например, "время записи;число;число;число"), т.е. длина строки не фиксирована. Эта программа записывает данные не в постоянные интервалы времени, запись может производиться как раз в секунду, так и раз в 10 секунд. Моя задача - это считывать данные с этого файла и заносить их в базу. Как это вообще реализовать? Файл может быть больших размеров, я должен записывать только новые данные, те, что уже записал - не учитывать. При запуске моей программы, с файла должны быть считаны и записаны в БД строки, которые еще не были записаны. В какую сторону копать? Пока что не представляю, как это можно воплотить в жизнь.

Язык: C++/Qt
  • Вопрос задан
  • 2274 просмотра
Решения вопроса 1
cjey
@cjey
В линуксе есть tail -f. Можно посмотреть как это реализовано там и сделать аналогично, либо запускать вашу программу tail -f /path/to/file | myprogram и читать из stdin строки и писать в базу.

В винде, мне кажется, стоит копать в сторону fseek(). Например хранить дату последнего сообщения, и через fseek читать последние 5-10% файла и заносить только новые записи. Коряво, но будет работать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@brutal_lobster
Копайте в сторону индексирования. Разделяйте на несколько файлов по времени записи, например.
Или храните "время записи -> оффсет внутри файла" где-нибудь отдельно.

Да даже можно использовать пайпы какие-нибудь - пусть данные записываются одновременно(или по очереди) в файл и в ваше приложение.

Ну и ничего страшного в большом размере файла нет. В вашем случае необходимо же считывать только последние записи - т.е. не весь файл, а только его конец.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 13:31
10000 руб./за проект
19 апр. 2024, в 13:12
35000 руб./за проект
19 апр. 2024, в 13:06
6000 руб./за проект