PROGRAMAR NA MEMORIA

PAYDANA 11/08/2014 15:20:55
#440337
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.

  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

NAUTILUZ 11/08/2014 15:41:04
#440339
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!
PAYDANA 11/08/2014 16:03:04
#440340
Tem razão, eu fiz nesta parte
  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?
MARCELO.TREZE 11/08/2014 17:10:51
#440343
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

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.


PAYDANA 11/08/2014 18:06:46
#440347
Obrigado Marcelo!

Vou fazer as mudanças agora mesmo.

Se tiver mais dicas são bem vindas.
NAUTILUZ 12/08/2014 10:17:05
#440362
Segue o link para criar o disco virtual na memoria
http://www.hardware.com.br/artigos/hds-virtuais-ram/
T+.
TUNUSAT 12/08/2014 14:26:34
#440368
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.
PAYDANA 12/08/2014 15:06:44
#440370
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
Faça seu login para responder