Загрузите 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