25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
1

Чтение больших файлов (несколько гигабайт)

24.06.2018, 06:25. Показов 2670. Ответов 51
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени!
Нужно прочесть и пропарсить крупный файл весом в несколько гигабайт.
Подскажите как это сделать...
Заранее благодарю!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2018, 06:25
Ответы с готовыми решениями:

Многопоточное чтение больших файлов
Привет всем! Подскажите пожалуйста как реализовать многопоточное чтение файла рамером 1gb и больше...

Чтение и обработка больших файлов
Нужно прочитать большой файл (несколько гигабайт), поделить содержимое файла на int'ы и посчитать...

Чтение запись файлов *.csv больших размеров
Доброго времени суток, форумчане! Нужно сделать: • прочитать данные таймсерий из файла...

Чтение в richtextbox больших файлов сопровождается большим потреблением памяти приложением
Здравствуйте! Вот мне не понятно: я читаю содержимое файла в RichTextBox (вес этого файла 207 мб)....

51
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,480
24.06.2018, 12:07 21
Author24 — интернет-сервис помощи студентам
Есть еще вариант со StringBuilder, но из всех наверно unsafe будет самым быстрым...
C#
1
2
3
4
5
6
7
8
9
10
11
12
static string Filterout(string input)
{
    StringBuilder sb = new StringBuilder(input);
 
    for(int i = 0; i < sb.Length; i++)
    {
        if (sb[i] < ' ')
            sb[i] = '.';
    }
 
    return sb.ToString();
}
1
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
24.06.2018, 12:11  [ТС] 22
unsafe просит компилировать с параметром компилятора /unsafe
0
Эксперт .NET
12089 / 8367 / 1280
Регистрация: 21.01.2016
Сообщений: 31,544
24.06.2018, 12:12 23
Pin1999, да, это тонкий намёк на то, что использовать unsafe лучше только в экстренных ситуациях.
0
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
24.06.2018, 12:16  [ТС] 24
Usaga, Тогда буду использовать второй ваш вариант )

Подскажите еще вот с чем:
Чем отличаются данные способы объединения массивов?

Сами массивы...
C#
1
2
byte[] outStream = { 0x00, 0x00, 0x0F, 0xCA, 0x00, 0x0A};
byte[] inStream = { 0x10, 0x20, 0x3F, 0x4A, 0x50, 0x6A };
C#
1
byte[] base_byte = outStream.Union(inStream).ToArray();
C#
1
byte[] base_byte = outStream.Concat(inStream).ToArray();
C#
1
2
3
byte[] newArray = new byte[inStream.Length + outStream.Length];
Array.Copy(outStream, 0, newArray, 0, outStream.Length);
Array.Copy(inStream, 0, newArray, outStream.Length, inStream.Length);
0
Эксперт .NET
17684 / 12870 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
24.06.2018, 12:19 25
Цитата Сообщение от Pin1999 Посмотреть сообщение
Как минимум в том что перебирать каждый символ вручную.
Не символ, а байт.
А что в этом страшного? Или вы думаете, что в каком-нибудь Replace символы каким-то магическим способом заменяются, не перебором?

Цитата Сообщение от Someone007 Посмотреть сообщение
из всех наверно unsafe будет самым быстрым
Если перебор ведется от 0 до .Length, то компилятор умеет это оптимизировать, убирая проверку на выход за пределы на каждой итерации.
unsafe же при определенных условиях может даже замедлить работу.
1
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
24.06.2018, 12:25  [ТС] 26
kolorotur, Я думаю что функция .Replase написана на более низкоуровневом языке, что делает ее быстрее )
0
Эксперт .NET
12089 / 8367 / 1280
Регистрация: 21.01.2016
Сообщений: 31,544
24.06.2018, 12:27 27
Цитата Сообщение от Pin1999 Посмотреть сообщение
Чем отличаются данные способы объединения массивов?
Union объединяет два множетса, отсеивая дубликаты. Второй и третий варианты функционально эквивалентны.

Добавлено через 1 минуту
Цитата Сообщение от Pin1999 Посмотреть сообщение
Я думаю что функция .Replase написана на более низкоуровневом языке
Так и есть, но логика у неё такая же: проход по массиву символов.
1
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
24.06.2018, 12:52  [ТС] 28
Цитата Сообщение от Usaga Посмотреть сообщение
но логика у неё такая же
Ну это и так ясно )

Добавлено через 23 минуты
Usaga, Еще один вопрос...
Не помню как его решал раньше (исходники погибли вместе с жестким диском, долбаный seagate)...

Есть массив, допустим long.
И мне нужно записать в него переменные.
Но сколько переменных может быть я знать не знаю.
Как его правильно вызвать чтоб программа не вылетала с ошибкой?

Делаю так...
C#
1
2
3
long[] arr = null;
//...
arr[id] = data;
0
Эксперт .NET
12089 / 8367 / 1280
Регистрация: 21.01.2016
Сообщений: 31,544
24.06.2018, 12:54 29
Pin1999, используйте List<long>.
1
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
24.06.2018, 13:02  [ТС] 30
Usaga, А List<List<long>> будет работать ?)
А то иногда бывает нужно сделать массив в массиве...
0
Эксперт .NET
12089 / 8367 / 1280
Регистрация: 21.01.2016
Сообщений: 31,544
24.06.2018, 13:48 31
Pin1999, всё будет работать.

Цитата Сообщение от Pin1999 Посмотреть сообщение
иногда бывает нужно сделать массив в массиве...
Вряд ли именно это нужно сделать...
0
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
24.06.2018, 14:46  [ТС] 32
Цитата Сообщение от Usaga Посмотреть сообщение
Вряд ли именно это нужно сделать...
Ок.
Принимаем значения в несколько потоков.
На основе значений потом будет построен график, потому значения записываем в массив.
Колво потоков заранее не известно.
Сохранять в файл или бд нельзя.
Как выйти из ситуации?

Мне в голову приходит только массив в массиве )
Array[0] = { 21, 43, ... , 10};
Array[1] = { 89, 57, ... , 12};
...
Array[n] = { 34, 48, ... , 69};
0
Эксперт .NET
12089 / 8367 / 1280
Регистрация: 21.01.2016
Сообщений: 31,544
24.06.2018, 15:16 33
Pin1999, ну ладно, в данном случае - нормальное решение, вроде бы.
0
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
25.06.2018, 07:55  [ТС] 34
Usaga, Если будут еще варианты - выслушаю )

Спасибо за помощь! )

Добавлено через 15 часов 33 минуты
Usaga, Подскажите с парой вопросов:
C#
1
2
List<List<int>> buffer = new List<List<int>>(N);
//N - будет относиться к колву массивов или к емкости каждого массива?
Нужно вставить в начало массива List<int> значение n, при этом остальные значения сдвинуть на 1, как это можно сделать?
C#
1
2
{ 4, 6, 2, 7, 3 }
{ n, 4, 6, 2, 7 }
0
Эксперт .NET
12089 / 8367 / 1280
Регистрация: 21.01.2016
Сообщений: 31,544
25.06.2018, 08:14 35
Цитата Сообщение от Pin1999 Посмотреть сообщение
Нужно вставить в начало массива List<int> значение n, при этом остальные значения сдвинуть на 1, как это можно сделать?
Скопировать все элементы начиная с конца. В освободившуюся первую позицию вставить n.
0
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
25.06.2018, 08:22  [ТС] 36
Usaga, Циклом?
Или есть аналог Array.Copy(buffer, 0, buffer, 1, buffer.Count - 1); ?
Либо создать временный массив для Array.Copy?
0
Эксперт .NET
12089 / 8367 / 1280
Регистрация: 21.01.2016
Сообщений: 31,544
25.06.2018, 08:27 37
Pin1999, да пройдитесь циклом. Можно и в отдельный буфер скопировать данные, а потом назад, начиная с позиции 1.
1
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
25.06.2018, 09:48  [ТС] 38
Usaga, А если ограничить List на допустим 5 значений и добавить 6-е через List.Add, он ведь тогда делает смещение, удаляя более старые значения замещая новыми?
Если так, то при остуствии огранечения он забивается таким же образом но ограничение уже будет пиковое.
И ничего делать не нужно, просто читать нужно не с начала а с конца.
0
Эксперт .NET
12089 / 8367 / 1280
Регистрация: 21.01.2016
Сообщений: 31,544
25.06.2018, 09:55 39
Цитата Сообщение от Pin1999 Посмотреть сообщение
А если ограничить List на допустим 5 значений и добавить 6-е через List.Add, он ведь тогда делает смещение, удаляя более старые значения замещая новыми?
Ничего эта коллекция не удаляет.
0
25 / 19 / 7
Регистрация: 16.08.2013
Сообщений: 1,354
25.06.2018, 10:04  [ТС] 40
Usaga, Жаль (
0
25.06.2018, 10:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2018, 10:04
Помогаю со студенческими работами здесь

Многопоточное чтение больших файлов
Доброго времени суток! Нужен совет. Имеется, скажем, 10 текстовых файлов 1.txt;2.txt и т.д. и...

Чтение больших файлов Excel
пытаюсь считать данные с XLSX файла (500 000 строк). на MSDN наткнутся на статью каким образом это...

Чтение файлов больших размеров >1Гб
Товарищи, подскажите как прочитать файл размером больше 1Гб.. у меня при чтении оперативка...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru