100万次循环!可以用多线程来分解实现吗?(20分)

  • 主题发起人 Flashcqxg
  • 开始时间
F

Flashcqxg

Unregistered / Unconfirmed
GUEST, unregistred user!
因为某些原因,我需要将100万条外部数据写到后台数据库中去,并且无法使用SQL语句,而只能用循环赋值的办法一条一条的写入。
代码:
while not query1.eofdo

begin

query2.append;

query2.field('字段').value:=query1.field('字段').value;
.....
.....
query1.next;
end;

如果真是100万次循环,不知道要写多长时间,能不能将其分解来循环呢?比如采用多线程的方式?!
希望大家帮忙解决下。分不够可再加。一但可行,立即结贴。
谢谢!
 
可以啊 不过线程不用太多 10个足以
 
不用每次都提交,可以用事务模式,比如1万条提交一次,可能快点
 
谢谢 wonhunter:能不能写个主要过程的示例代码呢?
 
DIGUA:不想用其它的,只想把我的代码改为多线程的。谢谢。
 
多线程对楼主的问题没有任何作用的, DIGUA的方法是解决问题的可取办法;
 
我觉得用不用线程都一样, 因为100万条记录, 运行到后来, insert越来越慢,
是否可以这样, 先导1万条导到一个表中, 然后调sql存储过程把数据导到大表中,循环做100次,
 
越说越糊涂,究竟多线程有没有用?
 
多线程是用来解决多个任务同时执行的问题;
你的事情是: 要重复执行多次操作, 其实你的事情只是一个任务, 并不是多任务;
多看些资料, 再深入理解一下多线程的基本概念吧.
 
To 楼主:
不知您有几个 CPU,如果您有一个 CPU 阵列,再来谈什么多线程...
单 CPU 系统,多线程仅仅是起到响应输入的作用...
多线程、递归等等这些鸡肋,竟然被 N 多网友当成高科技,可悲啊...
 
vvyang:
如果我有两个CPU呢,多线程会不会起到提高速度的作用?
 
To Flashcqxg:
1、可以明确地告诉您,不会有提高!
2、数据库的瓶颈不在 CPU,而在于内存大小和硬盘速度,即使您有 4 个 CPU 估计也不会有明显提高,况且线程的调度和切换也会耗去 CPU 时间。
3、多线程不是高科技,它仅仅让您觉得你同时在干很多事情,一种感觉而已,实际上 CPU 在某一时间段内只能处理一件事情。与其搞虾米多线程,还不如提高您程序的执行优先级.
 
你这是一个循环的单任务,多核多CPU情况下才会有所改进.另外,可以考虑直接嵌汇编进行寄存器跳转
 
谢谢vvyang:
谢谢您解答。
能麻烦您解释下第3点中的 还不如提高您程序的执行优先级 是什么意思?应该怎么做吗?
 
程序优先级在 98 中比较好实现,NT 稍微麻烦点。不过设置执行优先级没什么太大必要,我只是对于多线程打个比方。
 
谢谢了,vvyang。
我马上结贴。另外还有一个问题,如果您有兴趣的话,麻烦帮看下吧。
生成SQL语句的奇怪问题:单引号(')居然变成了问号了(?)!!!
http://delphibbs.com/delphibbs/dispq.asp?lid=3892898
 
多人接受答案了。
 
DIGUA:不想用其它的,只想把我的代码改为多线程的。谢谢。
多线程对楼主的问题没有任何作用的, DIGUA的方法是解决问题的可取办法;
上面的说法是对的,100万条数据要导入,主要是慢在SELECT *FROM 出来有一百多条记录,这个等待你是无论如何也受不了的,不是多线程的问题,单线程处理的速度是不会慢的;
解决的方法
1、你要在数据源表中建一个标记字段
2、每次取一条记录:SELECT TOP 1 *FROM XX WHERE 标记字段=未处理
3、处理完后把这条记录的标记字段改为[处理],继续下一条;
4、目标表不能SELECT *FROM ,也可写成SELECT TOP 1 *FROM的样式,有个最好的语句就是:SELECT *FROM XX WHERE 1=2,这样目标表始终都只打开一条记录;
5、多线程多进程都是容易出问题的,会出现锁记录锁表的情况,当前的方法性能是稳定的,导多少都可以,如果你的取源SQL可以加上一个日期范置之类的条件,可以用多线程多进程的方法,一个日期范围占一个线程进行处理,多线程觉得麻烦就用多进程好了,把程序多开几个就搞定;
6、如果你的源数据处理后可以删除,那就更好,取一条处理一条,删掉;
7、如果你的源数据不能增加一个标记字段,那这个是最好的解决方案:
DIGUA:不用每次都提交,可以用事务模式,比如1万条提交一次,可能快点
 

Similar threads

S
回复
0
查看
747
SUNSTONE的Delphi笔记
S
S
回复
0
查看
696
SUNSTONE的Delphi笔记
S
S
回复
0
查看
956
SUNSTONE的Delphi笔记
S
S
回复
0
查看
779
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部