Запись во множество файлов

ldar
Дата: 27.05.2014 12:00:42
Подскажите советом.
Необходимо писать данные сразу в 1000 файлов, как лучше организовать. Вот код:
for(int g=0; g<3000;g++) 
                {
                    l = g % 1000;
                    var file = new FileStream("file"+l, FileMode.Append, FileAccess.Write, FileShare.ReadWrite | FileShare.Delete | FileShare.Read | FileShare.Write);
                    Serializer.Serialize(file1, aa);
                    file.Close();
                }

В каждом цикле открывает файл, записывает и закрывает и это все будет крутится в бесконечном цикле.
Мой вариант считаю не верным т.к. приходится постоянно открывать и закрывать файл, можно ли иначе?
Притом, что в другом потоке могут эти файлы считывать.
Belavik
Дата: 27.05.2014 12:29:42
А как можно записать в файл не открыв его? Делайте запрет на чтение/запись если файл используется и ждите пока "освободится"
Нахлобуч
Дата: 27.05.2014 12:29:53
База данных, например?

Вообще, не хватает информация. Что за данные пишутся, кто пишет, кто читает, как долго читает...
ldar
Дата: 27.05.2014 12:38:30
Нахлобуч
База данных, например?

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

Как раз пишу логику в замен базы данных, чтоб оптимизировать ресурсы.
Данные это показания с промышленных датчиков, 1000 уникальных датчиков с дискретностью 500ms, под каждый датчик файл. Читает эти файлы другой поток.
Сейчас придумал кое что, держу массив с открытыми файлами.
FileStream[] f= new FileStream[1000];
                for(int g=0; g<3000;g++) 
                {
                    l = g % 1000;
                    if(f[l]==null)
                        f[l]= new FileStream("file"+l, FileMode.Append, FileAccess.Write, FileShare.ReadWrite | FileShare.Delete | FileShare.Read | FileShare.Write);
                    Serializer.Serialize(f[l], aa);
                    f[l].Flush();
                }

Уже лучше 600 мс, нов се равно много.
Где-то в степи
Дата: 27.05.2014 12:39:54
Это какое то безумие, Вы что желаете, из одного потока передать данные на обработку в другой поток?
Нахлобуч
Дата: 27.05.2014 12:42:32
ldar
Как раз пишу логику в замен базы данных, чтоб оптимизировать ресурсы.

Тогда прямая дорога в RabbitMQ, например.

Поставщик заталкивает данные в очередь, а потребители (один или несколько) из нее читают и обрабатывают.
Belavik
Дата: 27.05.2014 12:43:11
ldar
Нахлобуч
База данных, например?

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

Как раз пишу логику в замен базы данных, чтоб оптимизировать ресурсы.
Данные это показания с промышленных датчиков, 1000 уникальных датчиков с дискретностью 500ms, под каждый датчик файл. Читает эти файлы другой поток.
Сейчас придумал кое что, держу массив с открытыми файлами.
FileStream[] f= new FileStream[1000];
                for(int g=0; g<3000;g++) 
                {
                    l = g % 1000;
                    if(f[l]==null)
                        f[l]= new FileStream("file"+l, FileMode.Append, FileAccess.Write, FileShare.ReadWrite | FileShare.Delete | FileShare.Read | FileShare.Write);
                    Serializer.Serialize(f[l], aa);
                    f[l].Flush();
                }


Уже лучше 600 мс, нов се равно много.

А писать данные с каждого датчика в отдельный файл - это наилучший вариант?
ldar
Дата: 27.05.2014 12:51:33
Belavik, Да, таким образом я файл размещаю в смысловые директории и таки образом экономлю 12 байт с каждой записи...Если все в один писать, то тогда лучше все разместить в БД только размер данных уже получится в 2 раза больше...
а это > 5 миллиардов записей в месяц, 116 Гигабайт в месяц или 57 Гигабайт...
ldar
Дата: 27.05.2014 12:53:20
Где-то в степи
Это какое то безумие, Вы что желаете, из одного потока передать данные на обработку в другой поток?

Один поток пишет файлы, архивирует. Другой поток или потоки читают эти файлы (запросы пользователей).
Belavik
Дата: 27.05.2014 12:54:03
ldar
Belavik, Да, таким образом я файл размещаю в смысловые директории и таки образом экономлю 12 байт с каждой записи...Если все в один писать, то тогда лучше все разместить в БД только размер данных уже получится в 2 раза больше...
а это > 5 миллиардов записей в месяц, 116 Гигабайт в месяц или 57 Гигабайт...

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