当前位置: 首页 > 面试题库 >

C#SQL导出(OutofMemory问题)

鲍国兴
2023-03-14
问题内容

我试图批量导出到sql表中,代码工作正常。完全没错,问题在于如何以270万行导出50列。有人可以帮我解决OUtofMemory异常。我知道为什么会这样,因为它试图将所有内容读取到内存中然后写入,但是我不确定如何将它分解成一行一行地读取然后写出来而不会花费很长时间。

string contents = File.ReadAllText(textBox3.Text);

string tableid = tableid = Regex.Match(contents, @"CoreDBCaseID=(?<id>\d+)").Groups["id"].Value;
string server = server = Regex.Match(contents, @"Server=(?<Server>[^;]+)").Groups["Server"].Value;
string security = security = Regex.Match(contents, "Security=(?<Security>[^;]+)").Groups["Security"].Value;
string database = database = Regex.Match(contents, "Database=(?<Database>[^\r]+)").Groups["Database"].Value;

string[] data = new string[] {
    string.Format("Table={0}", tableid),
    string.Format("Server={0}", server),
    string.Format("Security={0}", security),
    string.Format("Database={0}", database),
};
string sqltable = ("TDS_C" + tableid + "_table");
String cols = String.Join(",", listBox1.Items.Cast<String>().ToArray());
string sql = "select " + cols + " from " + sqltable + " where *;
SqlConnection con = new SqlConnection("Data Source=" + server + ";Initial Catalog=" + database + ";Integrated Security=" + security);
con.Open();
SqlDataAdapter tabadapter = new SqlDataAdapter(sql, con);
DataSet dataset = new DataSet();
tabadapter.FillSchema(dataset, SchemaType.Source, sqltable);
tabadapter.Fill(dataset, sqltable);
DataTable tbltarget = dataset.Tables[0];
string output_text =
    tbltarget.Columns.Cast<DataColumn>().ToList()
    .Select(col => col.ColumnName)
    .Aggregate((current, next) => current + "|" + next) + "\r\n"
+
    tbltarget.Rows.Cast<DataRow>().ToList()
    .Select(row => row.ItemArray.Aggregate((current, next) => current.ToString() + "|" + next.ToString().Replace("\n", "")))
    .Cast<string>().Aggregate((current, next) => current + "\r\n" + next);

File.WriteAllText(@"C:\Export.txt);

con.Close();

问题答案:

不要填写数据集。取而代之的是,使用数据读取器,然后您可以在读入数据时将其流式传输出去,这意味着内存占用空间要小得多。

您可以考虑从数据库进行异步读取,并触发对文件的异步写入。这将停止每次读写操作是完全阻塞的操作。

简单的例子:

using (SqlConnection connection = new SqlConnection(connectionString)){
connection.Open();
using (FileStream strm = new FileStream(filePath)){
using (TextWriter wrt = new TextWriter(strm)){
SqlCommand cmd = new SqlCommand(sql, connection);
IDataReader rdr = cmd.ExecuteReader();
while rdr.Read()
{
    wrt.Write(rdr[0].ToString() + "|" + rdr[1].ToString(); // change for your manipulation of the columns
}
}}}


 类似资料:
  • 问题内容: 这是我的Main.java源代码。它是从neo4j-apoc-1.0示例中获取的。修改的目的是存储2个节点和1个关系的1M记录: 经过几次迭代(大约150K),我得到了错误消息: “ java.lang.OutOfMemoryError:位于org.neo4j.kernel.impl.nioneo的java.nio.ByteBuffer.allocate(ByteBuffer.java

  • 在你完成模型后,你可以保存模型表结构和关系为一个脚本文件。“导出 SQL”功能为脚本生成一个 SQL 文件。若要开始使用导出 SQL 功能,从菜单栏选择“文件”->“导出 SQL”。 常规属性 文件 设置输出的文件名和位置。 对象 选择你想导出的模型对象。 高级属性 【注意】下列选项会根据你所选择的图表数据库类型而有所不同。 包含自动递增 如果勾选了这个选项,将会在 SQL 文件中包含表自动递增。

  • 在你完成模型后,你可以保存模型表结构和关系为一个脚本文件。“导出 SQL”功能为脚本生成一个 SQL 文件。若要开始使用导出 SQL 功能,从菜单栏选择“文件”->“导出 SQL”。 常规属性 导出到文件 设置输出的文件名和位置。 选择要导出的对象 选择你想导出的模型对象。 高级属性 【注意】下列选项会根据你所选择的图表数据库类型而有所不同。 用级联删除 如果勾选了这个选项,将会在 SQL 文件中

  • 在你完成模型后,你可以保存模型表结构和关系为一个脚本文件。“导出 SQL”功能为脚本生成一个 SQL 文件。若要开始使用导出 SQL 功能,从菜单栏选择“文件”->“导出 SQL”。 常规属性 文件 设置输出的文件名和位置。 对象 选择你想导出的模型对象。 高级属性 【注意】下列选项会根据你所选择的图表数据库类型而有所不同。 包含自动递增 如果勾选了这个选项,将会在 SQL 文件中包含表自动递增。

  • 诸葛io提供了SQL查询的功能,以方便企业中的数据分析师和有需求的高级用户使用SQL表达式查询和分析用户行为数据。 在SQL查询平台您可以撰写SQL语句,并执行查看查询结果以及对查询结果进行可视化分析。 如果您需要将查询结果进行的处理,或和其他数据(如业务数据库中的数据)进行整合,以便产出进一步的分析结果或报告;诸葛io的SQL查询提供了查询结果的下载功能,在查询结果列表的切换图表功能栏,点击“下

  • 根据业务功能,我们需要在多线程环境中的不同位置读取多个excel文件(包括.xls和.xlsx格式)。每个线程负责读取一个文件。为了测试性能,我们用。xls和。xlsx格式创建了2个文件集。一个文件集只有20行数据,而另一个文件集包含300,000行数据。我们能够成功地读取。xls格式的两个文件,并将数据加载到表中。即使对于20行的data.xlsx文件,我们的源代码也运行良好。但是当执行流开始读