C# 处理大数据量读取问题

orcale中 clob字段存储着 "889.123,556,111"这样的数据,数据量很大,几十万条。
现在要按逗号拆分,存储,目前的做法是仅是拆分成数组,然后遍历数组入库,
如下, R21 R22 长度也是不相同的,如果在循环中写判断,大神们有没有什么好的思路,给个点建议
string[] R21 = CLOBA数据.Split(new char[] { ',' }, StringSplitOptions.None);
string[] R22 = CLOBB数据.Split(new char[] { ',' }, StringSplitOptions.None);
........
for (int i = 0; i < R21.LENGTH; i++)
{
循环插入 ......................
insert into table (R21[i],R22[]) ;
.......................
}

第1个回答  推荐于2018-04-30
1.可以使用存诸过程+临时表的方式,具体请研究或是Baidu.
2.可以使用SqlServer的SqlBulkCopy,NET有相关的支持.比一行行插入速度提高1K倍以上.
SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);
bulkCopy.DestinationTableName = "SpecialList";
bulkCopy.BatchSize = 500;
bulkCopy.BulkCopyTimeout = 300;

if (dt != null && dt.Rows.Count != 0)
{
bulkCopy.WriteToServer(dt);
}

SORRY,我看错了.OTP.NET也有对OracleBulkCopy的支持,用法大同小异,比循环插入和拼接SQL快了一止一点点...追问

您好,这个方法效率很好,服务器数据库数据只保留5天,第二天会删除第一天的,第三天会删除第二天的。以此类推,而且表里面都是clob这样的大数据,没有主键,有没有什么方法可以每次执行时候都读到最新的数据呢?这样读出来,每次都会插入很多重复数据

追答

这个东西和上面的技术无关,根据你的业务需求获取相应的数据就行了,如果不能获取到正确的数据,你应该检查你的数据库设计是否满足业务要求.

本回答被提问者和网友采纳
第2个回答  2013-08-26
建议是用orcale来处理,for循环效率很低。
或者你可以设置一个缓冲区,比如,100行100行的来。
方法很多种,具体,你自己试试。追问

对,我就需要这样类似缓冲区的模式,读几万条数去flush()一下,您那里有没有这样的代码,或者相关的网页,介绍下,谢谢啦。

追答

oracle相对于sql,它明显多了一个rownum列可用。
那么,你要100行的缓冲区,为什么不从这里入手?
举个例子:
第一次循环:
where rownum>0 and rownum 100 and rownum <=200
以此类推,将每次语句查出来的结果集,进行for或者foreach的操作。
然后,你可以每行进行Split,拼接:insert into table (R21[i],R22[])
最后,使用事务一次性提交,所有即可。

这种样子,比你直接查表获取的结果集进行for或foreach要快的多。

第3个回答  2016-03-05
  n 批量插入
  /// <summary> /// 将DataTable中数据批量插入远程服务器的数据表中
  /// </summary>
  /// <param name="dt">源数据集</param>
  /// <param name="Conn">目标服务器的数据连接字符串</param>
  /// <param name="FieldStr">要插入的字段</param>
  /// <param name="TableName">目标服务器的表名</param>
  //protected void SqlBulkCopyData(DataTable dt, string Conn, string[] FieldStr, String TableName)
  //{ // //使用SqlBulkCopy把内存表DataTable里的数据插入答卷数据表
  // SqlBulkCopy bcp = new SqlBulkCopy(Conn); // //指定目标数据库的表名
  // bcp.DestinationTableName = TableName;
  // //指定源列和目标列
  // foreach (string field in FieldStr)
  // { // bcp.ColumnMappings.Add(field, field); // }
  // //写入数据库表 // bcp.WriteToServer(dt); // bcp.Close(); //}
  #endregion
第4个回答  2016-02-03
可否详细点
第5个回答  2013-08-26
这么标准的数据....你为什么不存为文本文档,然后直接用loadfile就好了

C# 处理大数据量读取问题
1.可以使用存诸过程+临时表的方式,具体请研究或是Baidu.2.可以使用SqlServer的SqlBulkCopy,NET有相关的支持.比一行行插入速度提高1K倍以上.SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);bulkCopy.DestinationTableName = "SpecialList";bulkCopy.BatchSize = 500;bulkCopy.BulkCopyTimeout = 300;if...

c#编程中关于大数据量的问题
1、逐行读取(这样内存消耗较小)2、将读取的结果存入Dictionary<key,value>类型中。3、存入Dictionary<key,value>前先判断是否存在。string value = "21001221110011";if (openWith.TryGetValue("21001221110011",out value)){ \/\/存在的处理 } else { \/\/不存在的处理 } 字典的效率比较高,查询时间是...

C#大数据量问题
您可以使用这些类中的部分或所有类来同步多个线程的活动,但是某些多线程处理支持由 C# 语言提供。例如,C# 中的 Lock 语句通过隐式使用 Monitor 来提供同步功能。二、线程的生命周期 三、与线程有关的类 与C#有关的类都在System.Threading命名空间中, System.Threading 命名空间提供一些使得可以进行多线...

C#如何在海量数据下的高效读取写入MySQL
最常见的操作便是 select 读取数据,然后在C#中对数据进行处理, 完毕后再插入数据库中。 简而言之就 select -> process -> insert三个步骤。 对于数据量小的情况下(百万级别 or 几百兆)可能最多1个小时就处理完了。但是对于千万级数据可能几天,甚至更多。 那么问题来了,如何优化??(数据库...

c# 大数据量问题
3000条数据,不是3000万条,不用考虑得这么精细。更何况,就算是3000万条,也不过是几十秒的时间,一般从数据库读取到展示,如果是3000万条的话,也要这么多时间的,如果电脑配置更加低的话,更久。所以foreach+foreach也没什么,3000条,一秒内就完了。

c#datatable怎么处理千万级数据
1、首先将大数据分成多个小数据块进行处理,可以减少内存占用和加快处理速度。可以使用DataTable的Select方法进行分页查询。2、其次对于需要耗费大量时间的操作,可以使用异步处理来避免阻塞主线程,提高程序的响应速度。3、最后对于数据量较大的表格,可以使用压缩算法对数据进行压缩,以减少内存占用。

c# 大数据量的串口通讯怎么处理
使用C#中的串口类然后进行串口类的初始化后【串口的设置,波特率,停止位等】,就可以进行串口的接收和发送数据了

C# webservie 传递一个大型byte数据,服务报错
我遇到过这类问题vxbg原因应该是你的update语句。你的sql语句的update 某列= 某值a本来是正确的40但是如果用来修改二进制数据就不行gko你可以修改成参数形式的sql语句例如:update [表名] set [列名] = @param1 where [列名] = 某值SqlParameter[] parameters = { new ...

c# 出现OutofMemory错误
C#我没用过,比如.net中的变量a=null;这种用法。因为gc操作过程中是检查这类变量有没有被使用(引用)如果有,就不回收。所以代码中尽量在使用完毕时加上=null的语句。大数据量操作,还是不建议使用.net、C#之类的语言进行,使用C比较好,能够自主控制内存的释放。

C# UDP通信 操作大数据时 减少丢包的方法
包多的时候,要能保证接收端在收到数据后能立刻再次回到监听状态,以防在处理这个包的消息的时候有新的包发过来却因为接收端还未回到监听状态而造成丢包。研究一下委托回调吧。另一个是要注意每个包不要携带过长的数据量,可以拆分成若干小包后在每个包头前编号,接收端在收到后排序整理,发现哪个编号...

相似回答