2016-03-11 3 views
0

Я создаю инструмент Valgrind, который генерирует некоторую информацию о частоте вызовов функций (в частности, сколько команд выполняется между вызовами). В настоящее время у меня установлен мой инструмент для записи короткой строки в файл дампа, который включает в себя поток, который выполняется, количество выполненных команд, введенную функцию и адрес этой функции. Для этого я использую предоставленную оболочку fprintf. Например, я мог бы получить дамп, который выглядит следующим образом:Как быстро сбрасывать информацию?

1, 7363505897, (null), 4033bd 
1, 1802196819, (null), 4033bd 
1, 1800457355, (null), 4033bd 
1, 1800903611, (null), 4033bd 
1, 1801692437, (null), 4033bd 
1, 1801040389, (null), 4033bd 
1, 1801611746, (null), 4033bd 
1, 1800840377, (null), 4033bd 
1, 1801334975, (null), 4033bd 
1, 1800615992, (null), 4033bd 
1, 1800791120, (null), 4033bd 
1, 1800710678, (null), 4033bd 
1, 1801015823, (null), 4033bd 
1, 1801594353, (null), 4033bd 
1, 1801029625, (null), 4033bd 
1, 1800482880, (null), 4033bd 

В тестировании, однако, я обнаружил, что, когда я пытаюсь запустить эту процедуру для всех функций, значительная часть информации не записывается файл. Например, в моем тестовом приложении функция, называемая conj_grad, выполняется 15 раз. Когда я конкретно использую ТОЛЬКО эту функцию, все 15 исполнений появляются в моем файле дампа; когда я использую ВСЕ функции, он появляется только один раз.

Я пришел к выводу, что я слишком часто пишу на диск. Есть ли (лучший) способ собрать эту информацию и записать ее на диск? Я не решаюсь создавать массивные буферы в памяти - инструмент уже засасывает 30+ ГБ на более крупные многопоточные программы, но при необходимости он может быть выполнен.

+0

'Я пытаюсь слишком часто записывать на диск': разве ожидается, что O.S не справится с этим? Такие вещи просто не происходят в разумных системах. – 3442

+0

@KemyLand - когда дело доходит до операционных систем, единственное, что я узнал в школе градиента, это то, что они «ожидаются», чтобы гарантировать многие вещи, но на практике всегда есть лазейка/исключение. Что касается моего вывода - я основываю это исключительно на том, что я видел до сих пор. Я мог бы быть совершенно неправым - не будет в первый раз, но я не знаю, что еще вызывает проблему. – tonysdg

+1

Да, операционные системы гарантируют много вещей, которые на практике они не могут, например, избегать ситуаций нехватки памяти. Однако, основываясь на теории/коде, которые я знаю в отношении ОС, если вы не используете какой-то редкий камень, нет такой вещи, как «ситуация с ошибкой записи или слишком быстро». Ядро может просто приостановить ваш процесс, если это так. В конце концов, вы * не * пишете на диск, но рассказываете ядру, что писать в файл, а затем делает это ядро ​​/ драйвер устройства. Все хорошо вписывается. Файловые системы, блокирующие устройства ... Все было бы повреждено, если бы это произошло, и это не так. – 3442

ответ

1

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

Разумным способом сделать это будет запись в буфер, который вы закроете, когда достигнет определенного, относительно небольшого размера (например, MB или около того) или конфигурируемая длительность (например, 1 секунда) ,

Таким образом, вы напишете много полных блоков и, возможно, частичный блок, амортизируя запись частичного блока, уменьшая количество данных, которые могут быть потеряны из-за сбоя до вашего временного предела (например, 1 сек).

+0

Как отметил @kemyland в своем комментарии выше - мой вывод о записи на диск даже кажется правильным? Или я должен искать в другом месте? Несмотря ни на что, я обязательно сделаю это. – tonysdg

+0

ОС обрабатывает записи на диск как можно лучше. Если вы храните вещи в блочном хранилище, он должен обеспечить целостность всего блока. Если блок уже частично записан, ОС сначала должна прочитать содержимое блока, а затем обновить их и сбросить результат обратно на диск. –

+0

Это оказалось не моей точной проблемой (связано с использованием глобальных переменных), но это была проблема * a *. Поэтому я ценю ответ! – tonysdg

Смежные вопросы