Издержки информации журнала в файлах
Я делаю несколько долгих симуляций, которые могут занять от нескольких часов до нескольких дней, и я записываю информацию в файлы. Размер файлов может достигать сотен мегабайт, а внутри находится просто список чисел. Я действительно обеспокоен накладными расходами, которые это вызывает. Я хотел бы спросить, действительно ли накладные расходы при использовании этого метода велики, и если есть какой-либо другой, более эффективный способ сделать то же самое, просто запишите информацию.
Я использую C++ и для регистрации файлов, я просто использую общие методы fprintf. Чтобы объяснить издержки, если вы можете привести практический пример, аналогичный тому, как использовать файлы, которые занимают это время, не используя их в этот раз, это будет идеально.
Я провел некоторый тест, но я понятия не имею, растут ли накладные расходы линейно с размером файлов. Я говорю, что, возможно, это не то же самое, что добавить строку в файл размером 1 МБ, чем файл размером 1 ГБ. Кто-нибудь знает, как увеличиваются накладные расходы с размером файла?
3 ответа
Я думаю, тебе просто нужны некоторые расчёты.
Пусть "сотни Мб" будут 400 МБ.
Пусть "от нескольких часов до нескольких дней" будет 48 часов.
(400 * 1024 * 1024 байта) / (3600 * 48 секунд) = 2427 байтов / сек
Очевидно, что вы можете просто наблюдать за вашей системой или использовать реальные цифры для расчета, но, используя приблизительную оценку выше, вы получаете около 2 КБ / с, что довольно тривиально по сравнению со средними пределами жесткого диска.
Так что нет, накладные расходы не очень большие. И да, есть более эффективные способы сделать это, но вы, вероятно, потратите больше времени и усилий, чтобы оправдать минимальные сбережения, которые вы получаете, если только ваши цифры не сильно отличаются от заявленных вами.
"Сотни мегабайт", вероятно, не имеют значения в течение нескольких дней. Сотни гигабайт вполне могут быть значительными, но, вероятно, все равно не будут огромными.
Существует очевидный способ узнать ответ для вашего конкретного приложения: запустите симуляцию с включенным ведением журнала и рассчитайте время. Затем запустите его (с тем же вводом) с выключенным ведением журнала и рассчитайте время. Сравните разницу. В идеале, сделать это несколько раз, чтобы уравновесить другие нарушения. Я подозреваю, что вы обнаружите, что потенциальная выгода от большого количества журналов значительно перевешивает снижение производительности.
Вы можете поместить данные в вектор STL и сделать профилирование на ваших данных, например:
- исключить повторные строки;
- сохранить только различия;
- сбросить данные через некоторое время;
- выберите конкретные данные для сохранения;
- так далее...