- Регистрация
- 08.11.2015
- Сообщения
- 1 787
- Благодарностей
- 2 453
- Баллы
- 113
Есть на первый взгляд простая задача - взять случайную строчку с файла скажем 10 раз по 10 строк.
Сам файл большой - из-за чего загрузить его в ОЗУ нельзя (да и в многопотоке - каждый поток если подгрузит себе такое добро - печалька будет).
Как бы Вы решали эту проблему?
На коленке, очевидным для меня является решение примерно такое:
Как можно более лаконично/правильно реализовать подобный функционал?
P.S. Смущает меня, что
И в целом, есть сомнение на счёт что произойдет если два потока будут читать в "ленивом" режиме один и тот же файл.
Также
Сам файл большой - из-за чего загрузить его в ОЗУ нельзя (да и в многопотоке - каждый поток если подгрузит себе такое добро - печалька будет).
Как бы Вы решали эту проблему?
На коленке, очевидным для меня является решение примерно такое:
C#:
Random rand = new Random();
string path = @"C:\file.txt";
IEnumerable<string> lines = File.ReadLines(path).Where(x=>!string.IsNullOrEmpty(x)); // Задача на чтение файла без загрузки в ОЗУ всего файла
int count = lines.Count(); // Считаю количество строчек без загрузки всего файла в ОЗУ
for(int j=0;j<10;j++){
for(int i = 0;i<10;i++)
project.SendInfoToLog(lines.ElementAt(rand.Next(count))); // Получаю нужную строчку (в ОЗУ улетает только выбранная строчка)
}
P.S. Смущает меня, что
int count = lines.Count();
может выходить за пределы максимально допустимых значений...И в целом, есть сомнение на счёт что произойдет если два потока будут читать в "ленивом" режиме один и тот же файл.
Также
lines.ElementAt(1);
принимает int и что делать, если количество элементов выходит за пределы int и нужно взять такой номер элемента?
Последнее редактирование: