JT1992 Ответов: 2

Исключение System out of memory при загрузке электронной таблицы excel с более чем 100000 строками и 25 столбцами в gridview


Очень нужна помощь по проекту. я должен загрузить gridview с огромным количеством данных 100k строк и около 27 столбцов. datatable выдает мне ошибку исключения system out of memory каждый раз, когда я загружаю его, а затем пытаюсь привязать gridview, который размещен ниже.


Что я уже пробовал:

я проводил исследования уже около 2 недель, и ничего не помогло. может ли кто-нибудь дать мне правильный ответ относительно того, что мне нужно сделать?
Ниже приведено то, что я делаю, чтобы загрузить электронную таблицу непосредственно в набор данных, который дает мне исключение system out of memory. Но теперь я хотел бы использовать базу данных access.

Public Function loadExcel()
        If GlobalVariable.outputSelectBackButtonFlag = True Then
            BindData()
        Else
            ''loadExcel Function to show the file to the gridView.
            Dim MyConnection As System.Data.OleDb.OleDbConnection
            Dim DtSet As New System.Data.DataSet("TaskList")
            Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
            Dim taskTable As New DataTable("TaskList")

            Dim filePath = Path.Combine(GlobalVariable.savedPath, GlobalVariable.excelFileName)
'Code to Use an Oledb Connection to get data from the Excel File
            If File.Exists(filePath) Then
                MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filePath & ";Extended Properties='Excel 12.0 Xml;HDR=YES;';")
                MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection)
                DtSet = New System.Data.DataSet
                MyCommand.Fill(DtSet)
                GridView1.DataSource = DtSet.Tables(0)
                Session("TaskTable") = DtSet
                BindData()
                MyConnection.Close()
            Else
                Response.Redirect("UploadFile.aspx", True)
            End If
			Return Nothing
End Function

2 Ответов

Рейтинг:
1

OriginalGriff

Решение простое: не делайте этого.
Подумайте о том, что вы делаете с точки зрения пользователя - какая польза от таблицы со 100 000 строками на 27 столбцов? Что пользователь должен с этим делать? Как вы думаете, сколько времени потребуется ему или ей, чтобы найти нужную информацию?

И у него заканчивается память, потому что каждая отдельная ячейка-это (по крайней мере) одно отдельное окно с собственным оконным дескриптором. Итак, вы пытаетесь создать 2 700 000 новых окон-и это глупо, медленно и слишком много для Windows, чтобы справиться с ними.

Подумайте о своем приложении и перепроектируйте его, чтобы использовать подкачку, поиск, фильтрацию. Потому что если вы этого не сделаете, он не только не будет работать, но и ваши пользователи будут страстно ненавидеть его.


JT1992

как я должен перейти на страницу с приведенным выше кодом, есть ли способ, которым я мог бы это сделать?;

Graeme_Grant

Есть случаи, когда работа с таким объемом данных существует. Я работал над электронными таблицами Excel с еще большим количеством данных! Я должен признать, что это был не быстрый процесс... Электронные таблицы такого размера обычно включают сводные таблицы.

JT1992

я действительно не понимаю, что вы сделали для того, чтобы получить большие электронные таблицы excel. мне нужно показать их все. отчаянно ищет помощи.

Рейтинг:
0

Patrice T

Цитата:
я должен загрузить gridview с огромным количеством данных 100k строк и около 27 столбцов.

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


JT1992

но я должен отобразить все 100000 строк и столбцов, как это можно сделать с помощью моего кода выше с помощью подкачки. я действительно в замешательстве

Patrice T

Выглядит хорошим решением

JT1992

но для этого требуется ценообразование? неужели нет другого кодового способа сделать это?

Graeme_Grant

Syncfusion Windows Forms[^]- проверьте их Лицензия Сообщества[^].