Я курсор загружаю файлы от 10k до 200k, поэтому я ищу некоторые повышения производительности здесь.C# OpenFileDialog улучшение производительности
Вот как я это делаю:
List<string> myFiles = new List<string>();
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Multiselect = true;
openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
if (openFileDialog.ShowDialog() == true)
{
foreach (string filename in openFileDialog.FileNames)
{
myFiles.Add(filename);
}
}
string[] files = myFiles.ToArray();
Splitter(files);
private void Splitter(string[] file)
{
try
{
tempDict = file
.SelectMany(i => File.ReadAllLines(i)
.SelectMany(line => line.Split(new[] { ' ', ',', '.', '?', '!', }, StringSplitOptions.RemoveEmptyEntries)))
.GroupBy(word => word)
.ToDictionary(g => g.Key, g => g.Count());
}
catch (Exception ex)
{
Ex(ex);
}
}
Я думал о том, чтобы Еогеасп pararell:
Parallel.ForEach(openFileDialog.FileNames, filename =>
{
mySpam.Add(filename);
});
Является ли это безопасно? Есть ли какие-либо улучшения в этом коде? Прямо сейчас, он становится отстающим, и программа «зависает» при загрузке этих файлов, поэтому было бы неплохо, если бы делали эти вещи «за сценой». Я использую WPF, и файлы загрузки начинаются после нажатия кнопки.
Рассматривали ли вы переписывания решение стандартного алгоритма, а не с помощью Linq? Это поможет вам понять, какие узкие места и предоставить вам больше свободы в реализации оптимизации. Вы считаете все отдельные слова во всех файлах? – Dusan
Кроме того, Linq обрабатывает все файлы одновременно, что также может привести к проблемам с памятью - и обработка всего сразу не требуется, вы должны обрабатывать файлы по одному и строить результат. – Dusan
@ Dusan, поэтому я должен изменить метод Splitter? Не думал о проблемах там .. хм. –