powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с файлами
17 сообщений из 17, страница 1 из 1
Работа с файлами
    #38691508
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть 300-400 файлов в каждом 200-300 строк. Количество файлов как и их размер постоянно растет и уже сейчас на некоторых заковыристых операциях гуи подмораживается. Есть операции как чтения так и изменения некоторых строк в файле.
Соответственно встает вопрос оптимизации.
Порывшись в гугле я остановился на двух подходах.
Первый
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private void GetStepname(string[] files, string stepname)
{
foreach (string file in files)
{
  sr = new StreamReader(file);
  using (sr)
 {
     while (!sr.EndOfStream)
    {
       line = sr.ReadLine();
       if (line.Contains(stepname))  //search for a limit  
       //и так далее           
   }

}
}


Второй
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private void GetStepname(string[] files, string stepname)
{
    foreach (string file in files)
   {
       string[] text = File.ReadAllLines(file);
      for (int i = 0; i < text.Length; i++)
      {
           if (text[i].Contains(stepname))
          //и так далее           
      }
}
}



Вопрос, какой предпочтительней.
И еще такой вопрос - перебор файлов делать внутри метода или снаружи
Код: c#
1.
2.
3.
4.
5.
6.
private void buttonGetFields_Click(object sender, EventArgs e)
{
    string[] files = new string[listBoxFiles.SelectedItems.Count];
    listBoxFiles.SelectedItems.CopyTo(files, 0);
    GetStepname(files, stepname);
}


Или
Код: c#
1.
2.
3.
4.
5.
6.
7.
private void buttonGetFields_Click(object sender, EventArgs e)
{
    foreach (string file in listBoxFiles.SelectedItems)
    {
        GetStepname(file, stepname);
    }
}
...
Рейтинг: 0 / 0
Работа с файлами
    #38691548
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что вы делаете с этими файлами?
...
Рейтинг: 0 / 0
Работа с файлами
    #38691553
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
Вопрос, какой предпочтительней.
И еще такой вопрос - перебор файлов делать внутри метода или снаружи


Приходит Сара к раввину.
– У меня сегодня брачная ночь, так я думаю: мне в постель лечь в комбинации или без?
В это время прибегает Абрам:
– У меня проблема: коммунисты хотят, чтобы я вступил в колхоз! Что делать?
Раввин:
– Абрам, вступишь ты в колхоз или нет – тебя все равно вые…ут. Кстати, Сара, тебя это тоже касается.

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

в отдельном потоке обработку файлов делай
...
Рейтинг: 0 / 0
Работа с файлами
    #38691567
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79а что вы делаете с этими файлами?
я беру из них данные, добавляю, модифицирую.
...
Рейтинг: 0 / 0
Работа с файлами
    #38691590
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

Оба указанных вами подхода по сути одно и тоже. Почему у вас несколько сот файлов? Вы не можете их объединить в один?

Какова специфика работы с файлами? Вы меняете данные постоянно или один раз за запуск приложения? Возможно, имеет смысл не закрывать каждый раз файлы после модификации, а держать открытыми?
...
Рейтинг: 0 / 0
Работа с файлами
    #38691735
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79jenya7,

Оба указанных вами подхода по сути одно и тоже. Почему у вас несколько сот файлов? Вы не можете их объединить в один?

Какова специфика работы с файлами? Вы меняете данные постоянно или один раз за запуск приложения? Возможно, имеет смысл не закрывать каждый раз файлы после модификации, а держать открытыми?

это CSV файлы для хранения локальных переменных и другой информации о тестах. формат я не могу менять TestStand, по крайней мере та версия которая у меня, дает две опции - таблицы в базе данных, и CSV файлы. файлы построены по строгой модели я не могу ее менять.
...
Рейтинг: 0 / 0
Работа с файлами
    #38691739
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да в дополнение - приложение чисто для удобства - допустим в 300 файлах надо поменять значение переменной - не лопатить же все руками.
...
Рейтинг: 0 / 0
Работа с файлами
    #38691748
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7таблицы в базе данных,
с базой было бы сильно проще. не думали?
...
Рейтинг: 0 / 0
Работа с файлами
    #38691816
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79jenya7таблицы в базе данных,
с базой было бы сильно проще. не думали?

Я не только думал, я делал. В TestStand версии 4.2 с которой я работаю есть баг, который мы не смогли решить. И потом файл это довольно удобная вещь - быстро открыл, посмотрел, изменил, перебросил на другой комп, все быстро и легко. А теперь представьте что данные хранятся в таблицах и кто-нибудь захотел просмотреть их у себя на компе. Тут возникает по крайней мере три вопроса
1. Установлен у тебя MySQL?
2. Установлен у тебя MySQL Workbench?
3. Умеешь ты писать SQL Query?
ах да ну давайте еще сделаем дамп, создадим базу данных....
...
Рейтинг: 0 / 0
Работа с файлами
    #38691822
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

Ну это ваше мнение, я его не поддерживаю, но это неважно. В контексте заданного вами вопроса ответ следующий:

1) Выносите обработку файлов в асинхрон. Вариантов много - Backgroundworker, Task, async/await, BeginInvoke и т.д.
2) Файлы держите открытыми, а не переоткрывайте каждый раз. Не забывайте Flush()
3) Если осилите, то MemoryMappedFiles, благодаря чему вы можете сразу отобразить файлы в память

Пункт 3 - это если требуется максимально быстро работать с файлами.
...
Рейтинг: 0 / 0
Работа с файлами
    #38691840
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79jenya7,

Ну это ваше мнение, я его не поддерживаю, но это неважно. В контексте заданного вами вопроса ответ следующий:

1) Выносите обработку файлов в асинхрон. Вариантов много - Backgroundworker, Task, async/await, BeginInvoke и т.д.
2) Файлы держите открытыми, а не переоткрывайте каждый раз. Не забывайте Flush()
3) Если осилите, то MemoryMappedFiles, благодаря чему вы можете сразу отобразить файлы в память

Пункт 3 - это если требуется максимально быстро работать с файлами.

Пункт 2 я не понял.
...
Рейтинг: 0 / 0
Работа с файлами
    #38691876
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я так понял самый лучший способ работы с файлом - быстро считать содержимое - отпустить файл - быстро обработать содержимое - и если надо записать содержимое обратно в файл.
...
Рейтинг: 0 / 0
Работа с файлами
    #38692037
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Пункт 2 я не понял.

Когда вы обращаетесь к File или using (StreamReader), то вы открываете файл, совершаете операцию, закрываете файл. Открытие/закрытие файлов вообще операция небыстрая, и вы на 400 файлов потратите немногим менее 1/10 секунды только на это.

Так что Dispose нужно делать при закрытии приложения. А чтобы данные не терялись, нужно скидывать кэш на диск методом Flush

Далее, зачем вам при каждом открытии считывать все его строки? Держите содержимое файлов в памяти, а все изменения скидывайте на диск.
...
Рейтинг: 0 / 0
Работа с файлами
    #38692078
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79Когда вы обращаетесь к File или using (StreamReader), то вы открываете файл, совершаете операцию, закрываете файл. Открытие/закрытие файлов вообще операция небыстрая, и вы на 400 файлов потратите немногим менее 1/10 секунды только на это.


то есть во время операции 400 файлов будут открыты в конце? ну в общем то как мне кажется это не срашно. но возникает другой вопрос - если я хочу записать обратно в файл File.WriteAllLines(file_path, buffer); - возникне ексэпшен, файл ведь занят.

Arm79Далее, зачем вам при каждом открытии считывать все его строки? Держите содержимое файлов в памяти, а все изменения скидывайте на диск.

сколько время держать? я могу работать с файлами сегодня, потом через пару дней, или через неделю.
...
Рейтинг: 0 / 0
Работа с файлами
    #38692088
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7если я хочу записать обратно в файл File.WriteAllLines(file_path, buffer); - возникне ексэпшен, файл ведь занят.
Если вы открыли этот файл, почему он должен быть занятым?


jenya7сколько время держать? я могу работать с файлами сегодня, потом через пару дней, или через неделю.
И все эти недели ваша программа запущена?
...
Рейтинг: 0 / 0
Работа с файлами
    #38692157
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,
Спасибо за информацию. Буду делать выводы.
...
Рейтинг: 0 / 0
Работа с файлами
    #38692160
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

Удачи. И я вас настоятельно советую БД. С ней будет меньше всего проблем.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с файлами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]