stellus Ответов: 2

Загрузка Csv становится очень медленной VB.NET


Всем Привет,
Мне нужно, чтобы загрузить CSV-файл с asp.net с vb.net
я сделал загрузку csv-файла из vb.net
В тот момент, когда я поднимаю вас, когда я загружаю менее 50 строк, то файл загружается очень быстро, но когда я загружаю более 100 строк, то он приходит очень медленно (значит, приходит через 5 минут, потому что данные очень огромны)
Итак, какой важный шаг мне нужно сделать, чтобы этот вопрос был решен?

Пожалуйста, найдите мой код ниже,

Using dt As New DataTable()
                  Adp.Fill(dt)

                  'Build the CSV file data as a Comma separated string.
                  Dim csv As String = String.Empty

                  For Each column As DataColumn In dt.Columns
                      'Add the Header row for CSV file.
                      csv += column.ColumnName + ","c

                  Next

                  'Add new line.
                  csv += vbCr & vbLf

                  For Each row As DataRow In dt.Rows
                      For Each column As DataColumn In dt.Columns
                          'Add the Data rows.
                          csv += row(column.ColumnName).ToString().Replace(",", ";") + ","c
                      Next

                      'Add new line.
                      csv += vbCr & vbLf
                  Next

                  'Download the CSV file.
                  Response.Clear()
                  Response.Buffer = True
                  Response.AddHeader("content-disposition", "attachment;filename=SqlExport.csv")
                  Response.Charset = ""
                  Response.ContentType = "application/text"
                  Response.Output.Write(csv)
                  Response.Flush()
                  Response.End()
              End Using


заранее спасибо.


с уважением,
стеллус.

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

загрузка csv становится очень медленной vb.net

Ralf Meier

Я не вижу ошибки generell в вашем коде - извините. Я думаю, что ваша проблема заключается в самом "получении данных", а не в построении вашего кода. Конечно, код можно было бы оптимизировать , но это не решит вашу "проблему загрузки"...

2 Ответов

Рейтинг:
0

Mehdi Gholam

Использовать StringBuilder() : https://www.dotnetperls.com/stringbuilder-vbnet[^]


Karthik_Mahalingam

5

Mehdi Gholam

Ура !

Рейтинг:
0

Patrice T

Небольшой трюк для ускорения вашего кода

Dim csv As String = String.Empty
Dim row_csv As String

...

For Each row As DataRow In dt.Rows
    row_csv = String.Empty
    For Each column As DataColumn In dt.Columns
        'Add the Data rows.
        row_csv += row(column.ColumnName).ToString().Replace(",", ";") + ","c
    Next

    'Add new line.
    row_csv += vbCr & vbLf
    csv += row_csv
Next


Karthik_Mahalingam

Хорошая идея, но тем не менее StringBuilder() имеет гораздо лучшую производительность,
я сталкивался с этим много раз

Patrice T

Я знаю, что это тот вид оптимизации, который использовался, когда string builder не существовал.

Karthik_Mahalingam

хм, приятно знать.

Patrice T

Повторное добавление маленькой строки к другой влечет за собой нагрузку, которая растет с квадратом числа операций.
Для n операции, рабочая нагрузка составляет n*(n+1)/2 или (n^2+n)/2.
1 + 2 + 3 + 4 + ⋯ - Википедия, свободная энциклопедия[^]
В этом случае предположим, что у вас есть 10 строк и 10 столбцов.
Решение OP дает n=100 с размером операции 1, оно дает рабочую нагрузку 100*101/2=5050
с моим решением построение строки составляет n=10, Размер=1 и рабочая нагрузка=55
построение большой строки n=10, размер=10 (потому что каждая строка состоит из 10 ячеек), рабочая нагрузка=550
Глобальная рабочая нагрузка 55*10+550=1100
При 100 рядах выигрыш еще лучше.