Написание текстовых файлов - производительность мудрая? - PullRequest
7 голосов
/ 21 июля 2011

Мы собираемся начать новый проект, который включает в конце процесса записи около 5000 файлов различных размеров.Все файлы являются обычными текстовыми файлами, и мне интересно, как лучше всего (если у кого-то есть опыт) написать их.

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

Интересно, есть ли у кого-то опыт и он может поделиться им со мной?спасибо

Ответы [ 4 ]

2 голосов
/ 21 июля 2011

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

Практическое правило заключается в уменьшении количества записей в файл. Обычно это самый быстрый способ, если сначала записать все в буфер памяти, а затем записать этот буфер на диск. (Очень плохим способом было бы написать char за char.)

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

В Windows есть API-интерфейс MultiMediaFile IO (собственный), который может работать быстрее, чем стандартные механизмы ввода-вывода (http://home.roadrunner.com/~jgglatt/tech/mmio.htm) в некоторых случаях, даже если ваш контент не является "Мультимедиа".

0 голосов
/ 22 июля 2011

При такой большой записи на диск я бы больше смотрел на расположение дисков (raid и т. Д.), Потому что сохранение нескольких циклов ЦП может быть не таким полезным, как более быстрая дисковая подсистема.

0 голосов
/ 22 июля 2011

Если вы используете стандартные библиотеки .Net и делаете что-то подобное (в блоке try catch):

using (StreamWriter writer = new StreamWriter("filenumber1.txt"))
{
    writer.Write("This is a test"); //Write no newline
    writer.WriteLine("This is a test"); //Write with newline
}

Производительность должна быть разумной.При записи в файл просто сохраняйте строки приличного размера (при необходимости читайте, записывайте и фрагментируйте), чтобы избежать проблем с памятью.Например, если данные, составляющие файл, составляют 10 гигабайт, необходимо было бы записать строки в чанах.

Однажды мне пришлось прочитать тысячи больших двоичных объектов в базе данных и отправить их на серверы распространения на сервере.файловая система.Моим первоначальным подходом было чтение и запись.Это было нормально, тогда я использовал многопоточный подход и получил приличный прирост производительности.

Сначала я бы сделал один подход и выполнил бы несколько тестов производительности.Если это занимает X времени, и все счастливы, готово.Если вам нужно сделать это Y, реализуйте подход с несколькими потоками.

Просто обратите внимание, я бы настроил количество потоков, которые можно настроить, чтобы можно было увеличить производительность. Слишком много потоков, и это замедляется.Нужно найти сладкое место, чтобы сделать его настраиваемым.Обычно это зависит от аппаратного обеспечения.

0 голосов
/ 21 июля 2011

Любопытно, что «лучший способ» знает только ты.

Например, запись большого файла с небольшими порциями может быть доступным решением, так как вы не потребляете слишком много памяти и выполняете свою работу «медленной» записью. Плохо : длительные операции ввода-вывода, Хорошо : недостаточно памяти

Или собирать данные большими порциями данных и выполнять отдельные атомарные записи. Плохо : гораздо больше памяти, что вам нужно. Хорошо : обычно предлагаемый выбор Открыть / Чтение-Запись / Закрытие в кратчайшие сроки,

Или используйте MemoryMappedFiles: используйте константы (обычно), указывающие на какой-либо файл, и переходите между доступной производительностью и низким потреблением памяти потреблением. Обычно очень хороший, если не только возможный, выбор для очень больших файлов, таких как обработка мультимедийных файлов.

Выбор за вами.

Как и материалы для глубокого анализа производительности, я бы предложил удивительный источник, например Rico Mariani blog

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...