Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
1 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 10
1

Как организовать чтение ОГРОМНЫХ (>2Gb) файлов?

04.02.2013, 22:44. Показов 3148. Ответов 17
Метки нет (Все метки)

Подскажите пожалуйста каким образом организовать чтение больших текстовых файлов в VB.NET.
Размеры файлов более 2Gb.

Заранее спасибо.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2013, 22:44
Ответы с готовыми решениями:

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

Чтение и запись в двумерный массив огромных файлов
Если в кратце то есть очень большой файла в длину и ширину. Написал программку ,но когда слишком...

Какие есть способы задания огромных массивов - более 2Gb?
Что делать, если требуется массив значительно превышающий максимально допустимую длину в MVS (2Gb)?...

Как организовать чтение даты из файлов
Здравствуйте. Разбираюсь с данными NetCDF, параллельно с дельфи и в МАТЛАБЕ. Небольшой код есть....

17
522 / 484 / 98
Регистрация: 25.12.2011
Сообщений: 1,176
05.02.2013, 00:42 2
Цитата Сообщение от frugi Посмотреть сообщение
Размеры файлов более 2Gb.
Ого, а что тебе надо прочитать определенную строку или весь текст?
1
1 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 10
05.02.2013, 00:52  [ТС] 3
Нужен весь файл.
В файле хранятся числовые значения, необходимые для дальнейшей обработки.
Построения графиков, анализ и тп..

Я решил реализовать чтение по частям (других идей в голове не родилось),
только вот знаний не хватает чтоб запилить все это правильно.
0
Заблокирован
05.02.2013, 08:10 4
frugi, И запасись дополнительными планками ОЗУ, или вообще работай на сервере для таких операций
1
1 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 10
05.02.2013, 11:51  [ТС] 5
inv.DS, а без доп планок ни как не получится? Пусть долго но все таки прочитать файл1
Специализированные программы читают же, без доп планок и без сервера!
0
Заблокирован
05.02.2013, 13:22 6
frugi, Ну чтение файлов требует большое потребление ОЗУ. ХЗ как быть. И я не видел еще программа которые читали бы такие объемы данных. По любому сервер!
1
1 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 10
05.02.2013, 14:30  [ТС] 7
inv.DS, например AutoCAD при загрузки в него больших облаков точек, правда без плагина PointTools тоже захлебывается.
Какой ни будь UltraPad (если не путаю названия, что то типа блокнота) грузит файлы по 1Gb и даже скролить можно без проблем.
Я подумываю о проецировании в память, на днях буду разбираться.
0
2 / 2 / 0
Регистрация: 15.09.2011
Сообщений: 54
07.02.2013, 18:11 8
Давным давно у меня была такая задача!
Тогда еще память была 640 кб.
Очень большой файл!
Сели, подумали, решили:
1. Файл не может быть большим. Он может состоять из большого количества нужных (или не нужных) данных.
1.1. Потоковые данные можно разбить на порции и анализировать по отдельности.
1.2. Даже если они попали в один файл - можно анализировать порционно, т.е. читать из файла только ту
информацию, которая нужна в текущий момент. Правда тогда все умели работать с памятью и функция
freemem была самая используемая.
1.3. Разбивка на промежуточные блоки, необходимая для анализа, возможна при любой задаче,
даже при составлении рядов и интегральных функций.
2. Если файл не является одномерным потоком данных, то он структуируется, т.е. разделяется на части
по определенным принципам/структурам. Опять же позиционирование внутри файла.

Даже потоковое видео с уплотнением имеет маркеры, соответственно можно прочитать только часть
данных и обработать. Потом еще часть.
Вобщем нет задач, которые вынуждают читать файл больше 2Гб.
1
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 5
07.02.2013, 18:23 9
Рекомендую приобрести доп.планку памяти или же если не хотите-сервер.
0
1249 / 957 / 134
Регистрация: 01.10.2009
Сообщений: 2,959
Записей в блоге: 1
07.02.2013, 20:56 10
Цитата Сообщение от serge_best Посмотреть сообщение
Рекомендую приобрести доп.планку памяти или же если не хотите-сервер.
а я рекомендую поменять комп на серверный с 32 гигами оперативки
А если серьезно, это бредовые предложения, нужно искать программные решения, а если Вы еще и разработчик в организации какой, и этой программой будут пользоваться многие, то вот и печальная история, пришел новый программист, нужно менять оборудование( Так получается?
0
Заблокирован
07.02.2013, 20:59 11
DM_AND, Зря вы так. Предложения нормальные... Как вы предлагаете, построчно читать, полтора ляма строк? Сколько уйдет на это время? Прочитать сразу весь файл тогда куда его вместить, если у тебя к примеру 512 Mb ОЗУ, или там 1 гиг, как быть? Почему игры не работают к примеру на 512 оперативе, а просят 2 гига? Наверно программеры решения не нашли, да, по вашему?
0
1249 / 957 / 134
Регистрация: 01.10.2009
Сообщений: 2,959
Записей в блоге: 1
07.02.2013, 21:02 12
Цитата Сообщение от inv.DS Посмотреть сообщение
Почему игры не работают к примеру на 512 оперативе, а просят 2 гига? Наверно программеры решения не нашли да по твоему?
Че за игра? Вы наверное не различаете рекомендовано и есть на самом деле. Игра должна запуститься в любом случаи, если только разработчики перед запуском не сделали проверку и если < то кирдык...
0
Заблокирован
07.02.2013, 21:18 13
DM_AND, Хм... ну запустите на 128 оперативке игру к примеру сталкер, да может запустится, но прорисовка будет ужасная, почему? Потому, что потоки обработки идут медленнее нет места ОЗУ, прочитал нарисовал выкинул, и так далее и жди пока там дерево проресуется. Тогда как ТС, хочет читать файл полностью, неужели не понятно о чем говорю... Если бы ТС написал читать построчно и сравнивать тогда и на 128 Mb работало бы, а он пишет читать полностью, ну или как его поняли многие.

MSDN - File.ReadAllLines - метод (String)

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Imports System
Imports System.IO
 
Public Class Test
    Public Shared Sub Main()
        Dim path As String = "c:\temp\MyTest.txt"
        Dim sw As StreamWriter
 
        ' This text is added only once to the file.
        If File.Exists(path) = False Then
 
            ' Create a file to write to.
            Dim createText() As String = {"Hello", "And", "Welcome"}
            File.WriteAllLines(path, createText)
        End If
 
        ' This text is always added, making the file longer over time
        ' if it is not deleted.
        Dim appendText As String = "This is extra text" + Environment.NewLine
        File.AppendAllText(path, appendText)
 
        ' Open the file to read from.
        Dim readText() As String = File.ReadAllLines(path)
        Dim s As String
        For Each s In readText
            Console.WriteLine(s)
        Next
    End Sub
End Class
1
522 / 484 / 98
Регистрация: 25.12.2011
Сообщений: 1,176
09.02.2013, 17:16 14
Не вот если у вас такой тхт файл:
0(индекс) далее данные.
1(индекс) далее данные.
2(индекс) далее данные.
И нужно получить определенную строку то:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    Sub Main()
        Console.WriteLine("Чтение данных!")
        Dim B() As Byte = IO.File.ReadAllBytes("D:\1.txt")
        Console.WriteLine("Данные успешно прочитанны, в кол-ве " & B.Length - 1 & ".")
A:
        Console.WriteLine("Введите индекс строки: ")
        Dim Index As Integer = CInt(Console.ReadLine())
        Dim Text As String = ""
        Dim C As Integer = 0
        Dim StartPos As Integer = 0
        Dim EndPos As Integer = 0
        Console.WriteLine("Начинаем поиск!")
        For i = 0 To B.Length - 1 Step 1
            If B(i) = 10 Then
                StartPos = EndPos
                EndPos = i
                C = C + 1
                If Index = C Then
                    Exit For
                End If
            End If
        Next
        Console.WriteLine("Строка найдена: " & StartPos & " " & EndPos & ".")
        Console.WriteLine("Перевод строки!")
        If StartPos = 0 Then
            For i = StartPos To EndPos - 2 Step 1
                Text = Text & Chr(B(i))
            Next
        Else
            For i = StartPos + 1 To EndPos - 2 Step 1
                Text = Text & Chr(B(i))
            Next
        End If
        Console.WriteLine("Ваша строка: " & Text)
        GoTo A
    End Sub
Ну конечно не очень быстро но во много раз быстрее (пробовал на 600 мб. файле).
2
1 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 10
11.02.2013, 17:27  [ТС] 15
Огромное всем спасибо за поддержку в этом вопросе.
Сразу хочу извиниться за не совсем корректно поставленный вопрос.
Поясняю:
- Файл большое (около 2 Гб)
- Читать весь файл целиком, для моей задачи нет необходимости.
- Структура данных в файле известна.

Для своих нужд я решил следующее (соглашаясь SelenSoft) - читать файл стоит или порциями (MMF) или по строке, выполнять необходимые операции. Из-за ограничений связанных с памятью мне кажется нереально загружать весь файл целиком.
Для проверки я использовал файл размером 1 Гб, содержащим 30 мил. строк. вида -
-22.9350014 3169.33521 -55.4300041
Для измерения скорости выполнения использовал API GetTickCount.

1) Вариант с чтением по строке.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Imports System.Text
Imports System.IO
 
Module Module1
    Public Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long
    Private Const FName As String = "D:\tmp\30m.txt"
       Sub main()
        Dim tick1 As Long = GetTickCount()
        Dim k As Integer = 0
        Try
            Dim sr As StreamReader = New StreamReader(FName)
            Dim line As String
            Do
                line = sr.ReadLine()
                k += 1
                Loop Until line Is Nothing
            sr.Close()
        Catch E As Exception
            Console.WriteLine("The file could not be read:")
            Console.WriteLine(E.Message)
        End Try
        Console.WriteLine(CStr((GetTickCount() - tick1) / 1000) & " sec" & " strok = " & k)
        Console.ReadLine()
    End Sub
End Module
Я думаю пояснения не нужны.

Я решил не останавливаться на этом решение и в следующем варианте постарался использовать MemoryMappedFile. Ища инфу и примеры использования этого способа не раз натыкался на слова типа - "при работе с большими файлами MemoryMappedFile должно давать прирост в скорости" и я решил проверить.

2) Вариант с MMF.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Imports System.Text
Imports System.IO
Imports System.IO.MemoryMappedFiles
 
Module Module1
    Public Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long
    Private Const FName As String = "D:\tmp\30m.txt"
    Private splitChars() As Char = {Chr(10)}
    Sub Main()
        Dim k As Integer = 0
        Dim tick1 As Long = GetTickCount()
 
        Dim mappedFile As MemoryMappedFile = MemoryMappedFile.CreateFromFile(FName)
        Dim sr As StreamReader = New StreamReader(mappedFile.CreateViewStream())
 
        Dim line As String
        Do
            line = sr.ReadLine()
            k += 1
            'Console.WriteLine(line)
        Loop Until line Is Nothing
        sr.Close()
        Console.WriteLine(CStr((GetTickCount - tick1) / 1000) & " sec")
        Console.WriteLine("strok = " & k)
        Console.ReadLine()
 
    End Sub
 
End Module
Вот что получилось
Чтение по строке - 4.6 сек. Нагрузка на оперативку - 0.
Чтение с MMF - 4.95. Нагрузка на оперативку - равно размеру файла!!! ПОЧЕМУ?


Буду очень признателен если кто укажет на мою ошибку в использовании MMF,
почему нет прироста в скорости?
Почему жрется оперативка при использовании MMF?
Что я делаю не правильно?
0
522 / 484 / 98
Регистрация: 25.12.2011
Сообщений: 1,176
11.02.2013, 23:31 16
Используй выделение кода.
Цитата Сообщение от frugi Посмотреть сообщение
Почему жрется оперативка при использовании MMF?
Хороший вопрос хД:
MemoryMappedFile (заметки почитай).
1
1 / 0 / 0
Регистрация: 30.01.2013
Сообщений: 10
12.02.2013, 01:52  [ТС] 17
Цитата Сообщение от Jason Посмотреть сообщение
Используй выделение кода.

Хороший вопрос хД:
MemoryMappedFile (заметки почитай).
Спасибо, в следующий раз обязательно использую.
Дааааааа про MMF я походу не внимательно читал.
0
1249 / 957 / 134
Регистрация: 01.10.2009
Сообщений: 2,959
Записей в блоге: 1
27.02.2013, 20:44 18
Цитата Сообщение от inv.DS Посмотреть сообщение
ну или как его поняли многие.
Я его правильно понял, но начал с Вами диалог, и если у Вас и в работе такие планы добавить памяти, поставить сервак, то не дай бог, такой же пришел и к нам в вышестоящую организацию, и теперь мы будем добавлять памяти, лично у меня 80 компов, для запуска его чуда программ, чувак молодец...

Не по теме:

разобрались


Добавлено через 1 час 50 минут
inv.DS извиняй, беру свои слова обратно если не ты...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2013, 20:44

Как организовать чтение и запись в базу файлов?
Всем всего! Я многое пропустил в этой жизни, а хотелось бы наверстать упущенное. Отсюда вопрос:...

Организовать чтение исходных данных из файлов и запись результатов
Организовать чтение исходных данных из файлов и запись результатов в файлы. using System; using...

Обработка огромных файлов
Есть 2 файла бд по 130 млн записей, один вида: id:hash, второй hash:unhash Задача такова, значение...

Запись огромных файлов
Надо очень большой файл забить генерируемой инфой. Есть два варианта: Через проекцию; Записывать...


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

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

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