Telstra Ответов: 2

Как обработать 2M записей и сохранить их в datatable


Привет,

У меня есть 2M записей в таблице, которые я получаю через store proc. Затем я хочу преобразовать его в формат JSON. Когда я извлекаю его и сохраняю в datatable, я получаю ниже ошибку. Как я могу получить 2M записей и сохранить их в формате JSON.

Ошибка :- Память не могла быть записана.

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

DataTable dt = new DataTable();

           using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["CRM"].ConnectionString))
           {


               using (var cmd = new SqlCommand("SPGetList", connection))
               {
                   cmd.CommandType = System.Data.CommandType.StoredProcedure;
                   SqlDataAdapter da = new SqlDataAdapter();
                   da.SelectCommand = cmd;

                   da.Fill(dt);// This line causing an error and throwing the memory exception error.

               }
           }
           return DataTableToJSONWithStringBuilder(dt);

2 Ответов

Рейтинг:
2

Atlapure Ambrish

Можете ли вы попробовать использовать "считыватель данных" вместо адаптера и посмотреть, будет ли выборка данных успешной?

если "считыватель данных" работает для извлечения данных, то вы можете преобразовать/сохранить результирующий набор, возвращенный в datatable или сложный тип, необходимый для дальнейшей обработки (т. е. преобразования в JSON).

Вы также можете использовать TimeSpan для проверки разницы во времени, необходимый для выборки записей, используя адаптер и Reader. Е. Г.: делать эту работу за 50к, 150К и 500К записей. Я уверен, что считыватель данных будет работать быстрее.


Рейтинг:
1

OriginalGriff

Откуда нам знать?
Мы понятия не имеем, что ваш DataTableToJSONWithStringBuilder метод делает-кроме широкого контура, который дает название метода, - ни какого-либо представления о том, какая именно линия вызывает проблему.

Так что все будет зависеть от вас.
Поместите точку останова в первую строку этого кода и запустите приложение через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что именно то, что вы ожидали, произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас-вам пора освоить новый (и очень, очень полезный) навык: отладку!


Цитата:
Привет,
Я тоже думаю о том же. Но я не специалист по sql. Как я могу получать его партиями, например, сначала 50 тысяч, а потом так далее..


Зависит от вашей версии SQL server.
Старый способ-использовать ORDER BY с номером строки:
SELECT MyColumns 
FROM (SELECT MyClolumns, ROW_NUMBER() OVER (ORDER BY UniqueKeyColumn) AS RowNum FROM MyTable) s
WHERE s.RowNum BETWEEN @StartRow AND @EndRow
Это работает начиная с SQL 2005.
SQL 2012 представил OFFSET-FETCH:
SELECT MyColumns FROM MyTable ORDER BY UniqueKeyColumn OFFSET @STARTROW ROWS FETCH NEXT @ROWSCOUNT ROWS ONLY


Telstra

Привет,

Большое спасибо за ваш ответ.
Способ DataTableToJSONWithStringBuilder-это просто метод, который преобразовывает объект DataTable записи в формате JSON. Этот метод не является проблемой. Кроме того, когда я делал отладку, я получил ошибку на da.Fill(dt); строка с исключением памяти.
Это та область, где я не могу обработать 2M записей и не могу сохранить их в datatable из-за проблемы с памятью datatable. Как только я получил запись в datatable
Метод DataTableToJSONWithStringBuilder () преобразует его в Json.
Не могли бы вы помочь, как устранить эту ошибку?

Спасибо,
Нилеш

CodeWraith

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

OriginalGriff

Если ошибка возникает, когда вы пытаетесь извлечь все строки одновременно - а это именно то, что вы говорите, - тогда есть только одно решение: не извлекайте все строки одновременно...

Telstra

Привет,
Я тоже думаю о том же. Но я не специалист по sql. Как я могу получать его партиями, например, сначала 50 тысяч, а потом так далее..

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

OriginalGriff

Ответ обновлен

OriginalGriff

Кстати: вы понимаете, что JSON не является эффективным методом хранения, потому что он основан на тексте? И что 2 000 000 строк (при условии, что эти строки имеют какой-либо значительный размер) будут генерировать очень, очень большой JSON-файл?