PROGRAMAR NA MEMORIA
Pessoal fiz um programinha para comparar 2 arquivos; 1 com cerca de 3 milhões de linhas e o outro com duas mil.
ele pega linha por linha do arquivo maior e compara com cada uma das linhas do outro arquivo retornando a coicidencia entre os dois.
O codigo abaixo funciona bem, so que demora muito porcausa da quontidade de linhas.
Me falaram que existe uma forma de fazer com que o programa trabalhe na memoria ao invés de usar arquivos como faço mais ainda não sei como
Por favor se tiverem alguma outra forma ou alguma sugestão que acelere este processo agradeço muito.
ele pega linha por linha do arquivo maior e compara com cada uma das linhas do outro arquivo retornando a coicidencia entre os dois.
O codigo abaixo funciona bem, so que demora muito porcausa da quontidade de linhas.
Me falaram que existe uma forma de fazer com que o programa trabalhe na memoria ao invés de usar arquivos como faço mais ainda não sei como
Por favor se tiverem alguma outra forma ou alguma sugestão que acelere este processo agradeço muito.
Option Explicit
Private Sub Form_Load()
On Error Resume Next
Kill App.Path & [Ô] t.txt[Ô]
End Sub
Private Sub Command1_Click()
dInicio = Now
Dim f1 As Long
Dim f2 As Long
Dim linha As String
Dim GuardaLinha As String
Dim jt As Long
jt = [Ô]0[Ô]
f1 = FreeFile
Open App.Path & [Ô]\10.txt[Ô] For Input As f1
f2 = FreeFile
Open App.Path & [Ô] t.txt[Ô] For Output As f2
Do While Not EOF(f1)
Input #f1, linha
GuardaLinha = ComparandoCom(linha)
If GuardaLinha >= jt Then jt = GuardaLinha: Print #f2, linha & [Ô] [Ô] & [Ô] ( [Ô] & GuardaLinha & [Ô] )[Ô]
Loop
Close #f1
Close #f2
RichTextBox1.LoadFile App.Path & [Ô] t.txt[Ô], rtfText
Beep
MsgBox [Ô] [Ô] & [Ô]Arquivo TXT Extraido e Salvo em [Ô] & CDate(Now - dInicio)
End Sub
Private Function ComparandoCom(todosdoArquivo As String)
Dim f3 As Long
Dim linhaMarela As String
Dim rst As Variant
rst = [Ô]0[Ô]
f3 = FreeFile
Open [Ô]F:\Loteria NOVO\Loto Facilesultados.txt[Ô] For Input As f3
Do While Not EOF(f3)
Input #f3, linhaMarela
If Coicide(linhaMarela, todosdoArquivo) = [Ô]10[Ô] Then rst = rst + 1
Loop
Close #f3
ComparandoCom = rst
End Function
Private Function Coicide(Item1 As String, Item2 As String)
Dim S, D, Existe, Stem, Str1, Str2 As String
Dim Z, y As Integer
Existe = [Ô]0[Ô]
S = Replace(Item1, [Ô] [Ô], [Ô][Ô])
D = Replace(Item2, [Ô] [Ô], [Ô][Ô])
Stem = Len(S)
For Z = 1 To Stem Step 2
Str1 = Mid(S, Z, 2)
For y = 1 To Len(D) Step 2
Str2 = Mid(D, y, 2)
If Str1 = Str2 Then Existe = Existe + 1
Next
Next
Coicide = Existe
End Function
Olha uma dica boa seria você criar um disco virtual na memória assim o processo de leitura de arquivos fica mais rápido, outra coisa seria otimizar seu código,
Vc com um programa de milhões de linha já deve saber disto!
exemplo
For y = 1 To Len(D) Step 2
por
Buffer = Len(D)
For y = 1 To Buffer Step 2
Isto melhora o desempenho pois deixa de estimar o tamanho da variavel a cada momento!
Vc com um programa de milhões de linha já deve saber disto!
exemplo
For y = 1 To Len(D) Step 2
por
Buffer = Len(D)
For y = 1 To Buffer Step 2
Isto melhora o desempenho pois deixa de estimar o tamanho da variavel a cada momento!
Tem razão, eu fiz nesta parte
E esqueci de fazer na que você falou
Pode me dizer mais sobre este criar um disco virtual na memoria?
Stem = Len(S)
For Z = 1 To Stem Step 2
E esqueci de fazer na que você falou
Pode me dizer mais sobre este criar um disco virtual na memoria?
Colega é o seguinte o seu volume de informações é gigantesco, sinto muito mas nada do que você faça alterará mais do que alguns milionésimos de segundos.
porém existem alguns fatores que devem ser levados em consideração, primeiro você tem que saber declarar suas variáveis, exemplo:
se você declarar jt como long, não poderá colocar valores com string, veja
ou seja o valor de jt deveria ser um numero longo
jt = 0
Outra coisa seria o cuidado com declarações do tipo variante, ou seja quando vc não determina o tipo de variavel, ele se torna variant.
exemplo: de declaração variant
dim A
ou
dim a as variant
o que isso significa, significa que fica a cargo do computador determinar o tipo de variável está usando, isso te poupa trabalho, porém consome um tempo do programa pois ele terá de fazer a verificação sempre.
outra forma que engana é esta
a unica variavel acima declarada com string é a variavel D, as demais passam a ser variantes, veja o correto
as dicas que dei acima são valiosas, porém só seriam uteis se você tivesse desenvolvendo um programa com milhares de linhas, no seu caso a demora é na leitura e comparação de muitos dados, então minha dica é:
coloque uma mensagem de aguarde informando que o processo pode durar vários minutos.
porém existem alguns fatores que devem ser levados em consideração, primeiro você tem que saber declarar suas variáveis, exemplo:
se você declarar jt como long, não poderá colocar valores com string, veja
Dim jt As Long
jt = [Ô]0[Ô]
ou seja o valor de jt deveria ser um numero longo
jt = 0
Outra coisa seria o cuidado com declarações do tipo variante, ou seja quando vc não determina o tipo de variavel, ele se torna variant.
exemplo: de declaração variant
dim A
ou
dim a as variant
o que isso significa, significa que fica a cargo do computador determinar o tipo de variável está usando, isso te poupa trabalho, porém consome um tempo do programa pois ele terá de fazer a verificação sempre.
outra forma que engana é esta
Dim A, B, C, D as String
a unica variavel acima declarada com string é a variavel D, as demais passam a ser variantes, veja o correto
Dim A As String,B As String, C As String, D As String
as dicas que dei acima são valiosas, porém só seriam uteis se você tivesse desenvolvendo um programa com milhares de linhas, no seu caso a demora é na leitura e comparação de muitos dados, então minha dica é:
coloque uma mensagem de aguarde informando que o processo pode durar vários minutos.
Obrigado Marcelo!
Vou fazer as mudanças agora mesmo.
Se tiver mais dicas são bem vindas.
Vou fazer as mudanças agora mesmo.
Se tiver mais dicas são bem vindas.
Segue o link para criar o disco virtual na memoria
http://www.hardware.com.br/artigos/hds-virtuais-ram/
T+.
http://www.hardware.com.br/artigos/hds-virtuais-ram/
T+.
PAYDANA,
Estava pensando no seu caso e talvez tenha algo que possa te ajudar ... mas não tenho certeza.
Se você quiser perder um tempinho pensando...
Dê uma olhada neste exemplo:
MULTITHREADING VB6
http://www.vbmania.com.br/index.php?modulo=detalhe&id=9325
A ideia é quebrar o processamento em [Ô]pedaços[Ô].
Então você quebraria seu arquivo gigante em, por exemplo, 10 partes.
Depois jogaria cada uma das 10 partes em um processamento diferente e ... não sei se é o caso ... unificaria o resultado depois.
Detalhe: Cada um dos 10 processamentos é o seu próprio código rodando independente do outro, mas trabalhando em [Ô]pedaços[Ô] diferentes do arquivo original.
Mas não sei se isto ajudaria a aumentar a velocidade de processamento.
[][ô]s,
Tunusat.
Estava pensando no seu caso e talvez tenha algo que possa te ajudar ... mas não tenho certeza.
Se você quiser perder um tempinho pensando...
Dê uma olhada neste exemplo:
MULTITHREADING VB6
http://www.vbmania.com.br/index.php?modulo=detalhe&id=9325
A ideia é quebrar o processamento em [Ô]pedaços[Ô].
Então você quebraria seu arquivo gigante em, por exemplo, 10 partes.
Depois jogaria cada uma das 10 partes em um processamento diferente e ... não sei se é o caso ... unificaria o resultado depois.
Detalhe: Cada um dos 10 processamentos é o seu próprio código rodando independente do outro, mas trabalhando em [Ô]pedaços[Ô] diferentes do arquivo original.
Mas não sei se isto ajudaria a aumentar a velocidade de processamento.
[][ô]s,
Tunusat.
Bacana Tunusat, vou colocar aqui para ao invés de abrir o arquivo o programa o escreva e ja faça a comparação
Então posto aqui o resultaod se vai ganhar tempo
Então posto aqui o resultaod se vai ganhar tempo
Faça seu login para responder