Если данные поступают быстрее, чем вы можете их зарегистрировать, у вас есть реальная проблема. Дизайн производителя/потребителя, в котором WriteFile
просто помещается материал в ConcurrentQueue
или подобную структуру, а отдельный поток, обслуживающий эту очередь, отлично работает ... до тех пор, пока очередь не заполнится. И если вы говорите об открытии 50 000 различных файлов, резервное копирование будет происходить быстро. Не говоря уже о том, что ваши данные, которые могут составлять несколько мегабайт для каждого файла, будут еще больше ограничивать размер вашей очереди.
У меня была аналогичная проблема, которую я решил, добавив метод WriteFile
к одному файлу. Записи, которые он записывал, имели номер записи, имя файла, длину, а затем данные. Как указал Ханс в комментарии к вашему исходному вопросу, запись в файл выполняется быстро; открытие файла происходит медленно.
Второй поток в моей программе начинает читать файл, в который пишет WriteFile
. Этот поток читает заголовок каждой записи (номер, имя файла, длина), открывает новый файл, а затем копирует данные из файла журнала в окончательный файл.
Это работает лучше, если файл журнала и окончательный файл находятся на разных дисках, но все же может работать с одним шпинделем. Тем не менее, это, безусловно, тренирует ваш жесткий диск.
Его недостатком является необходимость в 2 раза больше места на диске, но с 2-терабайтными дисками стоимостью менее 150 долларов я не считаю это большой проблемой. Кроме того, в целом это менее эффективно, чем прямая запись данных (поскольку вам приходится обрабатывать данные дважды), но имеет то преимущество, что основной поток обработки не останавливается.
person
Jim Mischel
schedule
14.09.2011