求C#处理大量数据计算的思路

龙之沙漏 2017-10-09 12:51:05
各位大侠,小弟最近遇到一个问题,麻烦大家给个思路。

我的网站里边,有个对象,需要执行一个比较复杂的逻辑,像是计算啊,生成Excel之类的,单个大约需要2分钟左右可以把程序执行完成。

但是,如果,当我有1000个对象要批量执行的时候,经常会出现执行了一半之后就挂掉了。

有没有什么好办法,让1000多个对象可以顺利完成计算呢?执行效率可以不用管,只求可以让大批量数据能够顺利完成计算。

谢谢!
...全文
1363 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_19298327 2017-10-16
  • 打赏
  • 举报
回复
静静的看你们zb
龙之沙漏 2017-10-13
  • 打赏
  • 举报
回复
感谢大家,我最后还是做了个记录表,把执行记录一条一条记录下来,出错了就从中断的地方重新开始,算是变相解决了问题。
龙之沙漏 2017-10-13
  • 打赏
  • 举报
回复
引用 14 楼 yenange 的回复:
[quote=引用 13 楼 mationchen 的回复:] 我查了一下,执行速度慢的sql,基本没有,就超过0.5秒的一共才5条
你确定单个操作, 生成一个 EXCEL 文件需要 2 分钟? 1秒内可以取到的数据, 生成 EXCEL 需要 2 分钟?[/quote] 不是的,我这个东西的内部逻辑很复杂的,是一个对象关联其他几百个对象,然后根据关系做一些复杂的计算,然后入库,最后再读取数据生成excel的,最后耗时2分种左右。 生成excel的过程大约10来秒。
余山水 2017-10-11
  • 打赏
  • 举报
回复
建议:输出日志跟踪,看到那个记录出问题,在确定问题和处理。
吉普赛的歌 2017-10-11
  • 打赏
  • 举报
回复
引用 13 楼 mationchen 的回复:
我查了一下,执行速度慢的sql,基本没有,就超过0.5秒的一共才5条
你确定单个操作, 生成一个 EXCEL 文件需要 2 分钟? 1秒内可以取到的数据, 生成 EXCEL 需要 2 分钟?
龙之沙漏 2017-10-11
  • 打赏
  • 举报
回复
引用 12 楼 yenange 的回复:
先在服务器上查一下慢SQL吧:
SELECT OBJECT_NAME(qt.objectid, qt.dbId)  AS procName,
       DB_NAME(qt.dbId)                   AS [db_name],
       qt.text                            AS SQL_Full,
       SUBSTRING(
           qt.text,
           (qs.statement_start_offset / 2) + 1,
           (
               (
                   CASE statement_end_offset
                        WHEN -1 THEN DATALENGTH(qt.text)
                        ELSE qs.statement_end_offset
                   END 
                   - qs.statement_start_offset
               ) / 2
           ) + 1
       )                                  AS SQL_Part --统计对应的部分语句
       ,
       qs.creation_time,
       qs.last_execution_time,
       qs.execution_count,
       qs.last_elapsed_time / 1000000     AS lastElapsedSeconds,
       qs.last_worker_time / 1000000      AS lastCpuSeconds,
       CAST(
           qs.total_elapsed_time / 1000000.0 / (
               CASE 
                    WHEN qs.execution_count = 0 THEN -1
                    ELSE qs.execution_count
               END
           ) AS DECIMAL(28, 2)
       )                                  AS avgDurationSeconds,
       CAST(qs.last_logical_reads AS BIGINT) * 1.0 / (1024 * 1024) * 8060 AS 
       lastLogicReadsMB,
       qs.last_logical_reads,
       qs.plan_handle
FROM   sys.dm_exec_query_stats qs
       CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS p
WHERE  qs.last_execution_time >= CONVERT(CHAR(10),GETDATE(),120)+' 08:00'	--今天8点之后的慢SQL
       AND qs.last_elapsed_time >= 3 * 1000 * 1000							--只取执行时间大于 3 秒的记录
       AND qt.[text] NOT LIKE '%Proc_DBA%'
ORDER BY
       qs.last_worker_time DESC
我查了一下,执行速度慢的sql,基本没有,就超过0.5秒的一共才5条
龙之沙漏 2017-10-10
  • 打赏
  • 举报
回复
引用 5 楼 clark_kidd 的回复:
有几种可能,要不就是页面响应超时,要不就是你处理的时候有bug或者死锁,要不就是内存耗尽,还有其他我没想到的,首先你应该查明原因。 首先你应该要排除是否页面响应超时,现象是服务器上结果已经生成但是前台页面挂掉,如果是这样,那么应该优先考虑线程托管 然后你应该排除bug,是否有逻辑死锁、死循环,修正它 最后,如果是内存耗尽那就要考虑内存占用优化算法,现象是在任务管理器中观察iis的进程w3p,是否占用了大量内存 另外,1000个对象对于现在的计算机来说太少了,2分钟有很大的优化空间,比如生成excel,很多年前,我生成80MB的excel也只用了40秒
我的思路是这样子的,单个对象进行计算生成报表是没有问题的,这个过程大约需要2分钟。 批量的计算的时候,做个for,把要进行计算的所有对象放在这个循环中,调用单个对象进行计算的方法。 服务器的内存是足够多的,所以也不存在内存耗尽的问题。 不过我发现一个问题,就是sqlserver占用的内存特别大,我服务器32g内存,sgl占了将近20g,而我的整个数据库文件也才5个g左右,不知道这个有没有影响。
threenewbee 2017-10-10
  • 打赏
  • 举报
回复
后台作业,或者使用异步调用
吉普赛的歌 2017-10-10
  • 打赏
  • 举报
回复
先在服务器上查一下慢SQL吧:
SELECT OBJECT_NAME(qt.objectid, qt.dbId)  AS procName,
       DB_NAME(qt.dbId)                   AS [db_name],
       qt.text                            AS SQL_Full,
       SUBSTRING(
           qt.text,
           (qs.statement_start_offset / 2) + 1,
           (
               (
                   CASE statement_end_offset
                        WHEN -1 THEN DATALENGTH(qt.text)
                        ELSE qs.statement_end_offset
                   END 
                   - qs.statement_start_offset
               ) / 2
           ) + 1
       )                                  AS SQL_Part --统计对应的部分语句
       ,
       qs.creation_time,
       qs.last_execution_time,
       qs.execution_count,
       qs.last_elapsed_time / 1000000     AS lastElapsedSeconds,
       qs.last_worker_time / 1000000      AS lastCpuSeconds,
       CAST(
           qs.total_elapsed_time / 1000000.0 / (
               CASE 
                    WHEN qs.execution_count = 0 THEN -1
                    ELSE qs.execution_count
               END
           ) AS DECIMAL(28, 2)
       )                                  AS avgDurationSeconds,
       CAST(qs.last_logical_reads AS BIGINT) * 1.0 / (1024 * 1024) * 8060 AS 
       lastLogicReadsMB,
       qs.last_logical_reads,
       qs.plan_handle
FROM   sys.dm_exec_query_stats qs
       CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS p
WHERE  qs.last_execution_time >= CONVERT(CHAR(10),GETDATE(),120)+' 08:00'	--今天8点之后的慢SQL
       AND qs.last_elapsed_time >= 3 * 1000 * 1000							--只取执行时间大于 3 秒的记录
       AND qt.[text] NOT LIKE '%Proc_DBA%'
ORDER BY
       qs.last_worker_time DESC
闭包客 2017-10-10
  • 打赏
  • 举报
回复
问题的关键还是要知道为什么挂了。 一般长时间执行的程序都需要日志。
大然然 2017-10-10
  • 打赏
  • 举报
回复
上代码 · ·
yangguosheng 2017-10-10
  • 打赏
  • 举报
回复
想到了一个刚刚写代码的时候的一个东西,你不会用datareader了吧。
clark_kidd 2017-10-10
  • 打赏
  • 举报
回复
引用 7楼我是你的主体 的回复:
[quote=引用 5 楼 clark_kidd 的回复:] 有几种可能,要不就是页面响应超时,要不就是你处理的时候有bug或者死锁,要不就是内存耗尽,还有其他我没想到的,首先你应该查明原因。 首先你应该要排除是否页面响应超时,现象是服务器上结果已经生成但是前台页面挂掉,如果是这样,那么应该优先考虑线程托管 然后你应该排除bug,是否有逻辑死锁、死循环,修正它 最后,如果是内存耗尽那就要考虑内存占用优化算法,现象是在任务管理器中观察iis的进程w3p,是否占用了大量内存 另外,1000个对象对于现在的计算机来说太少了,2分钟有很大的优化空间,比如生成excel,很多年前,我生成80MB的excel也只用了40秒
我的思路是这样子的,单个对象进行计算生成报表是没有问题的,这个过程大约需要2分钟。 批量的计算的时候,做个for,把要进行计算的所有对象放在这个循环中,调用单个对象进行计算的方法。 服务器的内存是足够多的,所以也不存在内存耗尽的问题。 不过我发现一个问题,就是sqlserver占用的内存特别大,我服务器32g内存,sgl占了将近20g,而我的整个数据库文件也才5个g左右,不知道这个有没有影响。 [/quote]太不正常了,20G内存你是怎么用掉的?你的这个对象会频繁的访问数据库吗?
clark_kidd 2017-10-09
  • 打赏
  • 举报
回复
有几种可能,要不就是页面响应超时,要不就是你处理的时候有bug或者死锁,要不就是内存耗尽,还有其他我没想到的,首先你应该查明原因。 首先你应该要排除是否页面响应超时,现象是服务器上结果已经生成但是前台页面挂掉,如果是这样,那么应该优先考虑线程托管 然后你应该排除bug,是否有逻辑死锁、死循环,修正它 最后,如果是内存耗尽那就要考虑内存占用优化算法,现象是在任务管理器中观察iis的进程w3p,是否占用了大量内存 另外,1000个对象对于现在的计算机来说太少了,2分钟有很大的优化空间,比如生成excel,很多年前,我生成80MB的excel也只用了40秒
龙之沙漏 2017-10-09
  • 打赏
  • 举报
回复
引用 1 楼 daixf_csdn 的回复:
挂掉的原因找到没,先搞清楚


引用 3 楼 xuzuning 的回复:
网站?超时了呗


挂掉的原因我感觉是服务器的资源不够,iis重启了。
挂掉之后的显示如下:


应该也不是网站超时了,以前计算1500个的时候,大约需要1天半,是可以完成计算的。不过最近数据增加到了2000个,就不行了,而且也不知道是什么时候挂的。

有没有什么思路来处理这种问题?或者是可以从哪里找到到底是什么原因造成的这种问题
xuzuning 2017-10-09
  • 打赏
  • 举报
回复
网站?超时了呗
ilikeff8 2017-10-09
  • 打赏
  • 举报
回复
不管效率,那你排队处理呗,挂掉是有bug
圣殿骑士18 2017-10-09
  • 打赏
  • 举报
回复
挂掉的原因找到没,先搞清楚

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧