vibhuti sharan Ответов: 1

Загрузите xml-файл объемом 2 ГБ на SQL server с помощью sqlbulkcopy


Привет,

Я хочу загрузить 2 ГБ xml в sql server с помощью SqlBulkCopy. Казнь - это повешение без всякого результата.
Можем ли мы читать определенные узлы или фильтровать чтение xml-
ds.ReadXml(Server.MapPath("~/Data.xml"))
Сработает ли это в данном случае?

Есть ли еще какой-нибудь вариант загрузить эти огромные xml-файлы в БД?

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

мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;


namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Unnamed1_Click(object sender, EventArgs e)
        {
            string cs = ConfigurationManager.ConnectionStrings["CS"].ConnectionString;

            using (SqlConnection con = new SqlConnection(cs))
            {
                DataSet ds = new DataSet();

                ds.ReadXml(Server.MapPath("~/Data.xml"));


                DataTable mOb = ds.Tables["managedObject"];
                DataTable mOb_p = ds.Tables["p"];


                con.Open();


                using (SqlBulkCopy sb = new SqlBulkCopy(con))
                {
                    sb.DestinationTableName = "managedObject";
                    sb.ColumnMappings.Add("managedObject_Id", "managedObject_Id");
                    sb.ColumnMappings.Add("class", "class");
                    sb.ColumnMappings.Add("version", "version");
                    sb.ColumnMappings.Add("distName", "distName");
                    sb.ColumnMappings.Add("id", "id");
                    sb.ColumnMappings.Add("cmData_Id", "cmData_Id");
                    sb.BatchSize = 500000;
                    sb.BulkCopyTimeout = 10800;
                    sb.WriteToServer(mOb);
                }

                using (SqlBulkCopy sb = new SqlBulkCopy(con))
                {
                    sb.DestinationTableName = "p";
                    sb.ColumnMappings.Add("name", "name");
                    sb.ColumnMappings.Add("p_text", "p_text");
                    sb.ColumnMappings.Add("managedObject_Id", "managedObject_Id");
                    sb.BatchSize = 500000;
                    sb.BulkCopyTimeout = 10800;
                    sb.WriteToServer(mOb_p);
                }


            }
        }
    }
}

Garth J Lancaster

"Можем ли мы читать определенные узлы или фильтровать чтение xml -" - это вопрос ? если это так, то, к сожалению, ответ, по-видимому, нет .. возможно, это сопоставления столбцов, которые требуют времени, но я должен был бы увидеть статистику производительности и памяти, чтобы действительно попытаться решить

Без каких-либо подробностей data.xml, за исключением того, что он, кажется, имеет 2 различных типа данных, то, что я бы попытался, это уменьшить размер набора данных в несколько шагов
1) достаточные данные, чтобы убедиться, что процесс в целом работает, но, возможно, 100 записей
2) раскол data.xml в два типа/узла данных, как отдельные файлы - я думаю, что это то, что вы задаете в качестве первого вопроса, но я бы пошел еще дальше, поскольку каждый узел в каждом "разделенном" по типу файле содержит только столько данных, сколько ему нужно, и не более того
3) Оберните массовые копии в транзакцию - по одной на копию ...

[Править] с немного работы, вы могли бы также попробовать этот метод WriteToServerAsync

1 Ответов

Рейтинг:
2

#realJSOP

Попробуйте уменьшить BatchSize до 1000 (500 000) кажется слишком высоким, чтобы быть эффективным).

Это будет очевидно в течение секунды или двух, если это сработает. просто контролируя количество строк в целевой таблице.

Другой вариант-прочитать определенное количество (я бы не стал загружать больше 5000 или около того) записей из файла по одной за раз, а затем использовать SqlBulkCopy чтобы вставить их в базу данных.