Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 539
1

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

27.12.2015, 13:09. Показов 1633. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2015, 13:09
Ответы с готовыми решениями:

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

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

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

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

2
Эксперт .NETАвтор FAQ
10250 / 4994 / 1811
Регистрация: 11.01.2015
Сообщений: 6,198
Записей в блоге: 34
27.12.2015, 15:40 2
Цитата Сообщение от 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
13854 / 11227 / 4570
Регистрация: 17.03.2014
Сообщений: 22,631
Записей в блоге: 1
27.12.2015, 20:36 3
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2015, 20:36

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.