Если у меня есть несколько потоков, генерирующих блоки файла, как лучше всего записать блоки?
пример) 5 потоков, работающих с файлом из 500 блоков, блок 0 не обязательно завершается раньше блока 1, но выходной файл на диске должен быть в порядке. (блок 0, блок 1, блок 2, .... блок 499)
программа написана на C++, может ли fwrite() как-то "произвольно обращаться" к файлу? файл создается с нуля, то есть, когда блок 5 завершен, файл может все еще иметь размер 0, поскольку блоки 1–4 еще не завершены. Могу ли я напрямую записать блок 5? (с правильным fseek)
Этот фрагмент кода критичен к производительности, поэтому мне очень интересно, что может улучшить производительность. Это похоже на сценарий с несколькими производителями (генераторами блоков) и одним потребителем (писателем вывода). Идея заключается в том, что поток A может продолжать генерировать следующий блок после завершения предыдущего.
если fwrite может быть «случайным», то модуль записи вывода может просто брать выходные данные, искать и затем записывать. Однако не уверен, что этот дизайн может хорошо работать в больших масштабах.
Некоторые ограничения
- Каждый блок имеет одинаковый размер, генерируется в памяти
- размер блока известен заранее, но не общее количество блоков.
- общий размер составляет несколько ГБ. Большой.
- На одном сервере может выполняться несколько заданий. каждая работа описана выше. У них есть свои независимые генераторы/писатели, разностные процессы.
- Сервер представляет собой машину Linux/CentOS.
fseek
и вы найдете (хотя вы, вероятно, захотите накопить как минимум несколько килобайт последовательных данных, прежде чем выполнять поиск). - person Jerry Coffin   schedule 11.05.2016I need to implement some logic to merge the sub-files to get the right order of blocks
- или ты? Не могли бы вы просто оставить их в нескольких файлах и вычислить имя файла вместо смещения? Также устраняет проблему с блокировкой. - person Vlad Feinstein   schedule 11.05.2016