Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Danilo.

Como deixar esse script mais rapido

Recommended Posts

Diariamente tenho que processar um arquivo txt para colocar no DB, as vezes ele tem mais de 30mil registros as vezes tem 2mil.

O que posso mudar para deixar esse codigo mais rapido para o servidor processar?

 

 

'##################################
Session.LCID = 1046
Set obj = CreateObject("scripting.filesystemobject")
Set obj = obj.OpenTextFile(Server.MapPath("./VENDAS"), 1)
textHTML = obj.ReadAll
'response.write textHTML
IF inStr(1,textHTML,"The page cannot be found")>0 THEN
	response.write "Data inválida, ou o arquivo ainda não está disponível"
	response.end
END IF


Data = Cdate(mid(textHTML,37,2) & "/" & mid(textHTML,35,2) & "/" & mid(textHTML,31,4)) 
response.write data & "<BR>"
i1=3849 
for aa=1 to 30000
on Error resume next
		i = inStr(i1,textHTML,"02") 
		f = 350 
		d1 = mid(textHTML,i,f) 
		i1=i+f
		if i=0 then exit for
	
	TIPO	= trim(mid(d1,70,3)) ' retirar o que não precisa incluir no DB
	IF (TIPO="70" OR	 TIPO="80" OR TIPO="30" OR TIPO="12" OR TIPO="13" OR TIPO="10") THEN
		campo1 			= trim(mid(d1,58,12))
		campo2			= Clng(trim(mid(d1,88,03)))
		campo3			= Clng(trim(mid(d1,91,11)))/100
		campo4			= Clng(trim(mid(d1,102,11)))/100
		campo5			= Clng(trim(mid(d1,113,11)))/100
		campo6			= Clng(trim(mid(d1,124,11)))/100
		campo7			= Clng(trim(mid(d1,135,11)))/100
		campo8			= Clng(trim(mid(d1,152,11)))/100
		campo9			= Clng(trim(mid(d1,163,11)))/100
		campo10			= Clng(trim(mid(d1,174,5)))
		campo11			= Clng(trim(mid(d1,179,15)))
		campo12			= Clng(trim(mid(d1,194,17)))/100
		campo13			= Clng(trim(mid(d1,211,11)))/100	
		campo14			= Cdate(mid(d1,228,2) & "/" & mid(d1,226,2) & "/" & mid(d1,222,4))

		on error goto 0	
		set rs2=con.execute("SELECT * FROM Historico  WHERE data="&to_sql(data,"date")&" AND campo1='"&campo1&"' AND campo2="&campo2&" ")
		IF rs2.EOF then
			inclui_dados
		  else
			response.write "já estava no bando de dados: "
		END IF
		
	END IF	
next

'-----------------------------------------------------------------------
Sub inclui_dados()
	sql = "INSERT INTO Historico" & _ 
	"(" & _ 
	"Data," & _ 
	"campo1," & _ 
	"campo2," & _ 
	"campo3," & _ 
	"campo4," & _ 
	"campo5," & _ 
	"campo6," & _ 
	"campo7," & _ 
	"campo8," & _ 
	"campo9," & _ 
	"campo10," & _ 
	"campo11," & _ 
	"campo12," & _ 
	"campo13," & _ 
	"campo14" & _ 
	") VALUES (" & to_sql(Data,"date") & "," & _ 
	"" & to_sql(campo1,"text") & "," & _ 
	"" & to_sql(campo2,"number") & "," & _ 
	"" & to_sql(campo3,"text") & "," & _ 
	"" & to_sql(campo4,"text") & "," & _ 
	"" & to_sql(campo5,"text") & "," & _ 
	"" & to_sql(campo6,"text") & "," & _ 
	"" & to_sql(campo7,"text") & "," & _ 
	"" & to_sql(campo8,"text") & "," & _ 
	"" & to_sql(campo9,"text") & "," & _ 
	"" & to_sql(campo10,"number") & "," & _ 
	"" & to_sql(campo11,"number") & "," & _ 
	"" & to_sql(campo12,"text") & "," & _ 
	"" & to_sql(campo13,"text") & "," & _ 
	"" & to_sql(campo14,"date") & ")" & _ 
	""
	'response.write sql
	on error resume next
	con.Execute(sql)
	if err.Number <> 0 then
		response.write err.Description & & campo1 
	end if
	on error goto 0
End Sub
'##################################

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma sugestao seria ao inves de jogar um insert no for, montar numa variavel as sql's. Ao fim, fora do for, fazer apenas um insert de tudo. Exemplo:

 

for i=0 to 3
 sql = sql & "insert into TABELA (id) values ("& i &"); "
next

conexao.execute(sql)

Compartilhar este post


Link para o post
Compartilhar em outros sites

mais seu código realmente está tão lento assim, quanto tempo está levando para processar?

 

está incluindo uns 50 registros por segundo apenas, logo qdo tem uns 1000 registos dá uns 20 segundos, mas qdo tem 30000 dá 10 minutos.

 

 

o que dá um certo atraso é verificar cada um se ja nao está no DB, uma alternativa seria verificar uma unica vez se se nao tiver nenhum registro com aquela data então incluir todos de uma vez. O unico inconveniente desse jeito é que der erro na inclusao, depois se eu for tentar novamente, o que ja tinha sido feito pela metade, vai ficar duplicado.

 

mas sem chegar cada um, eu nao marquei o tempo, mas fica muitoooooo mais rapido.

 

alguma sugestão?

 

a solução da andrea_sp eu nunca usei talvez seja uma alternativa!

Compartilhar este post


Link para o post
Compartilhar em outros sites

a sujestão dela é uma boa alternativa, outra boa tbm é você dimensionar as variaveis, assim você diz ao servidor o quanto de memoria você vai utilizar, mais fora o que a andreia disse não tô vendo mais nada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok, eu resolvi aplicando a solução da andreia e tb retirei a consulta para verficar individualmente cada registro, faço um unica verificação para ver se tem algum registro com aquela data, se não tiver, insere tudo do jeito q a andreia sugeriu, se ja tiver algum, ai volta com uma opção para incluir novamente verificando duplicidade para cada registro, caso tenha ocorrido algum erro na inclusão.

 

ficou bem mais rapido.

 

grato,

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.