Member 10535790 Ответов: 3

Для каждого цикла медленное исполнение


Я пытаюсь преобразовать Datatable в строку JSON с помощью сериализации.

Datatable имеет 2 записи lakhs .я использую для каждой из них, чтобы взять каждую строку и преобразовать в JSON.
Но приложение не отвечает должным образом.

Пожалуйста помочь

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

Я пробовал с записями до 10 тысяч это кажется работает

Richard MacCutchan

200 000 записей в одной таблице данных? Как вы думаете, сколько времени потребуется, чтобы прочитать и обработать этот JSON, если вы когда-нибудь его преобразуете? Вам нужно переосмыслить свой дизайн.

BillWoodruff

https://www.codeproject.com/Article.aspx?tag=2.MTU5NDUwOjA6NjM3MzcwMjc2ODI5NzI0MjI0&_z=1977390

3 Ответов

Рейтинг:
2

OriginalGriff

Мы не можем сказать: мы понятия не имеем, что делает ваш код, так как у нас нет доступа к вашему жесткому диску!

А вы пробовали Галерея NuGet | Newtonsoft.В JSON 12.0.3[^] - обычно это работает довольно хорошо. Вы можете сериализовать набор данных / datatable в одной строке кода: Сериализация набора данных[^]


Рейтинг:
18

Pete O'Hanlon

Почему вы пытаетесь сериализовать отдельные строки? Вы выполняете здесь пару тысяч операций, когда сериализация всего набора данных будет выполнять только одну операцию сериализации. Измените код, чтобы сериализовать все, и вы увидите улучшения.


Рейтинг:
1

Richard Deeming

На первый взгляд, вы сериализуете каждую строку в a string и сцепление его с более крупной строкой - например:

// DON'T DO THIS!!!
string result = "";
foreach (var row in table)
{
    result += SerializeToJson(row);
}
Конкатенация строк в цикле происходит ужасно медленно. Для каждой строки вы должны создать новую string, скопируйте символы из существующей строки, добавьте символы из новой строки и сохраните результат в переменной.

Вместо этого вы должны использовать класс StringBuilder[^], или потоковая передача результатов непосредственно на выход.
var sb = new StringBuilder();
foreach (var row in table)
{
    sb.Append(SerializeToJson(row));
}

string result = sb.ToString();

// Or:
using (Stream stream = File.Create("... some path ..."))
using (TextWriter writer = new StreamWriter(stream))
{
    foreach (var row in table)
    {
        writer.Write(SerializeToJson(row));
    }
}

// Or, using JSON.NET:
using (Stream stream = File.Create("... some path ..."))
using (TextWriter writer = new StreamWriter(stream))
using (JsonTextWriter jsonWriter = new JsonTextWriter(writer))
{
    JsonSerializer serializer = new JsonSerializer();
    foreach (var row in table)
    {
        serializer.Serialize(jsonWriter, row);
    }
}
Как объединить несколько строк (руководство по C#) | Microsoft Docs[^]