Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 538

Чтение и обработка больших файлов

27.12.2015, 13:09. Показов 2293. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно прочитать большой файл (несколько гигабайт), поделить содержимое файла на int'ы и посчитать их сумму.
Как это сделать максимально быстро?
Я пока что сделал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        private void ReadAndProcessLargeFile(string theFilename)
        {
            var fileStram = new FileStream(theFilename, FileMode.Open, FileAccess.Read);
            using (fileStram)
            {
                byte[] buffer = new byte[megabyte];
                fileStram.Seek(0, SeekOrigin.Begin);
                int bytesRead = fileStram.Read(buffer, 0, megabyte);
                while (bytesRead > 0)
                {
                    if (BitConverter.IsLittleEndian)
                    {
                        Array.Reverse(buffer);
                    }
                    for (int i = 0; i < megabyte; i += 4)
                    {
                        sum += BitConverter.ToUInt32(buffer, i);
                    }
 
                    bytesRead = fileStram.Read(buffer, 0, megabyte);
                }
            }
        }
Как можно ускорить процесс?
Основная проблема в цикле (60% времени):
C#
1
for (int i = 0; i < megabyte; i += 4)
20% времени в:
C#
1
Array.Reverse(buffer);
и еще 20% времени в:
C#
1
fileStram.Read(buffer, 0, megabyte);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.12.2015, 13:09
Ответы с готовыми решениями:

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

Чтение больших файлов (несколько гигабайт)
Доброго времени! Нужно прочесть и пропарсить крупный файл весом в несколько гигабайт. Подскажите как это сделать... Заранее благодарю!

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

2
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
27.12.2015, 15:40
Цитата Сообщение от Kukurudza Посмотреть сообщение
Нужно прочитать большой файл (несколько гигабайт), поделить содержимое файла на int'ы и посчитать их сумму.
Как это сделать максимально быстро?
Попробуйте так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        static ulong ReadAndProcessLargeFile(string theFilename)
        {
            var sum = 0ul;
            const int megabyte = 1024*1024;
            using(var fileStram = new FileStream(theFilename, FileMode.Open, FileAccess.Read))
            {
                var buffer = new byte[megabyte];
                var bytesRead = fileStram.Read(buffer, 0, megabyte);
                while (bytesRead > 0)
                {
                    for (int i = 0; i < bytesRead; i += 4)
                    {
                        sum += (uint)(buffer[i] | buffer[i + 1] << 8 | buffer[i + 2] << 16 | buffer[i + 3] << 24);//littleendinan
                        //sum += (uint)(buffer[i] << 24 | buffer[i + 1] << 16 | buffer[i + 2] << 8 | buffer[i + 3]);//bigendian
                    }
 
                    bytesRead = fileStram.Read(buffer, 0, megabyte);
                }
            }
 
            return sum;
        }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
27.12.2015, 20:36
Kukurudza, я бы убрал Array.Reverse и делал бы преобразование вручную. Как-то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private unsafe void ReadAndProcessLargeFile(string theFilename)
{
    using (var fstream = new FileStream(theFilename, FileMode.Open, FileAccess.Read))
    {
        byte[] buffer = new byte[megabyte];
        while (true)
        {
            int bytesRead = fstream.Read(buffer, 0, megabyte);
            if (bytesRead == 0) break;
            
            fixed (byte* pbyte = &buffer[0])
            {
                for (int i = 0; i < bytesRead; i += 4)
                {
                    sum += *(uint*)(pbyte + i*4);
                }
            }
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.12.2015, 20:36
Помогаю со студенческими работами здесь

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

Подскажите паттерн для задачи (многопоточное чтение и обработка файлов)
Добрый день! Есть следующая задача. Нужно делать многопоточную программу. 2 потока читают данные с винчестера и готовят списки данных...

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

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

Обработка очень больших файлов
У меня есть большие текстовые документы, состоящие из 10 и 100 тыс символов каждый. Эти документы нужно обработать и сохранить в...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru