Ir para conteúdo
Fórum Script Brasil
  • 0

Leitura Em Binario Demoraaaaaa


ramon

Pergunta

Por que demora para carregar o meu arquivo que foi salvo em binario

Tipo veja se pode ser melhorado

Open caminho For Binary As #1

For Y = 0 To 200
For X = 0 To 20
For Z = 0 To 13
dado = Space(LOF(1))
Get #1, , dado
Banco(Y, X, Z) = dado
Next Z
Next Y
Next X

Close #1

Para gravar é rapido mas para ler demoraaaaaa

Poque tem algum jeito de se fazer a leitura mais rapido no modo binario?

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

De fato, é exatamente o que o iSoron falou. Veja como esse aqui lê mais rápido:

Dim banco(200, 20, 13) As String * 1
Dim i As Long

n = FreeFile()
Open caminho For Binary As #n
conteúdo = Input(LOF(n), n)
Close #n

i = 1
For Y = 0 To 200
    For X = 0 To 20
        For Z = 0 To 13
            banco(Y, X, Z) = Mid(conteúdo, i, 1)
            i = i + 1
        Next Z
    Next X
Next Y

Nesse caso, lê-se o arquivo inteiro para a memória e depois divide-se o mesmo para a matriz.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
E para gravar como seria pois eu não consegui abrir o arquivo usando este codigo?

Ah eu tenho mais duas matrizae para gravar e 2 variaveis como eu faria isso

Para gravar você pode tanto usar o modo Output quanto o próprio modo Binary (mas eu recomendo o primeiro e gravando tudo de uma vez só). Seria algo como:

Dim conteúdo As String
Dim i As Long

For Y = 0 To 200
   For X = 0 To 20
       For Z = 0 To 13
           conteúdo = conteúdo & banco(Y, X, Z)
       Next Z
   Next X
Next Y

n = FreeFile()
Open caminho2 For Output As #n
? #n, conteúdo
Close #n

E, creio que isso já responde a segunda pergunta também.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Hehehe... de fato. A concatenação é que fica lenta nesse código. Mas, experimente o seguinte então:

Dim conteúdo As String
Dim i As Long

conteúdo = string(200*20*13, chr(0))

For Y = 0 To 200
  For X = 0 To 20
      For Z = 0 To 13
          i=i+1
          mid(conteúdo, i, 1) = banco(Y, X, Z)
      Next Z
  Next X
Next Y

n = FreeFile()
Open caminho2 For Output As #n
? #n, conteúdo
Close #n

Veja se assim fica mais rápido. Não testei aqui.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

sim fica rapido

mas ali você especificou 52000 caracteres mas na verdade a minha matriz pode conter bem mais

E como eu vou definir isto já que não sei qiuntos caracteres tem minha matriz

Se eu for verificar vai gastar muito tempo dry.gif

Link para o comentário
Compartilhar em outros sites

  • 0

mas ali você especificou 52000 caracteres mas na verdade a minha matriz pode conter bem mais

Mas, se os valores dos "for"s forem aqueles mesmos (200, 20, 13), sempre será o mesmo tamanho.

E como eu vou definir isto já que não sei qiuntos caracteres tem minha matriz

Se eu for verificar vai gastar muito tempo dry.gif

Não seria ao contrário? Ou seja, saber a quantidade de bytes do arquivo para então calcular o tamanho da matriz? Se não, você está contradizendo o que disse acima (aqui você está dizendo que ela tem um tamanho fixo).

Além disso, e quanto à declaração...

Dim banco(200, 20, 13) As String * 1

... que coloquei no primeiro exemplo? Ela por si só já diz que a matriz tem um tamanho fixo. O que você está usando em seu lugar para defini-la como de tamanho dinâmico (alterável)?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Mas ai que ta você esta calculando como se cada dimensão dela tivesse apenas 1 caracter e na verdade poderia conter mais

tipo "ramon" tem 5 caracteres

Testa isso para você ver

Num modulo coloque


Public Times(3, 3) As String
Public Sub Calendario()
'Calendario gremio
Times(0, 0) = "Gremio"
Times(0, 1) = "Juventude"
Times(0, 2) = "Coritiba"
Times(0, 3) = "Flamengo"

'Calendario flamengo
Times(1, 0) = "Flamengo"
Times(1, 1) = "Coritiba"
Times(1, 2) = "Juventude"
Times(1, 3) = "Gremio"


'Calendario coritiba
Times(2, 0) = "Coritiba"
Times(2, 1) = "Flamengo"
Times(2, 2) = "Gremio"
Times(2, 3) = "Juventude"


'Calendario juventude
Times(3, 0) = "Juventude"
Times(3, 1) = "Gremio"
Times(3, 2) = "Flamengo"
Times(3, 3) = "Coritiba"
End Sub

Num form com dois botao

Private Sub Command1_Click()

Dim conteudo As String
Dim i As Long
Call Calendario

conteudo = String(3 * 3, Chr(0))
g = 1

For a = 0 To 3
  For b = 1 To 3
   d = Len(Times(a, b)) + 1
   Mid(conteudo, g, d) = Times(a, b) & "@"
   g = g + d
  Next b
Next a

n = FreeFile()
Open (App.Path + "\teste.txt") For Binary As #1
Put #1, , conteúdo
Close #1

End Sub

Private Sub Command3_Click()

n = FreeFile()
Open (App.Path + "\teste.txt") For Binary As #n
conteúdo = Input(LOF(n), n)
Close #n

varray = Split(conteúdo, "@")
q = UBound(varray)
i = 1
C = 0

For a = 0 To 3
  For b = 1 To 3
    Times(a, b) = varray(C)
    C = C + 1
  Next b
Next a

End Sub

Se fizer 3*3 vai dar erro pois tem mais de 1 caracteres em cada vetor na matriz

Link para o comentário
Compartilhar em outros sites

  • 0
Mas ai que ta você esta calculando como se cada dimensão dela tivesse apenas 1 caracter e na verdade poderia conter mais

tipo "ramon" tem 5 caracteres

Basta tirar o * 1 dali e ela fica com o tamanho variável. Mas, qual o intuito disso? Afinal de contas, se você for usar aquele seu primeiro código...

dado = Space(LOF(1))
Get #1, , dado
Banco(Y, X, Z) = dado

... *cada* posição da matriz (0, 0, 0), (0, 0, 1), (0, 1, 1), etc. vai ficar com o conteúdo *todo* do arquivo. Eu imaginei que você quisesse colocar um byte (um caracter) em cada posição.

O que, exatamente, você pretende fazer com esse código?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

O que eu quero é salvar tudo que tiver dentro da matriz em um arquivo

este é um exemplo, meu programa tem 5 matrizes e preciso salvar o conteudo dela em um arquivo

Então estou tentando fazer com que salve as matrizes em um arquivo e depois eu carregue o arquivo de volta para as matrizes.

o mais rapido possivel tanto no salvar como no carregar

Link para o comentário
Compartilhar em outros sites

  • 0
O que eu quero é salvar tudo que tiver dentro da matriz em um arquivo

este é um exemplo, meu programa tem 5 matrizes e preciso salvar o conteudo dela em um arquivo

Então estou tentando fazer com que salve as matrizes em um arquivo e depois eu carregue o arquivo de volta para as matrizes.

o mais rapido possivel tanto no salvar como no carregar

Só que nesse caso, você deveria ter tamanhos fixos para os dados ou algum delimitador. Se não, como ele vai saber que "Ramon" (que tem 5 caracteres) deve voltar para uma posição da matriz e que "Junior" (que tem 6 caracteres) deve voltar para outra posição? Veja que você não pode pegar os dados de 5 em 5 caracteres, já que o segundo tem 6 (e terão diversos outros com tamanhos diferentes).

Gravar e ler rapidamente já foi alcançado, mas como você está fazendo para carregar os dados de volta? Uma alternativa seria armazenar a posição dos dados junto com o valor, algo como:

0,0,0 = Ramon

0,0,1 = Junior

...

Ou ainda armazenar os dados com um delimitador, como:

Ramon;Junior;...

Daí ficaria fácil. E, outra coisa, você precisa realmente de usar uma matriz para isso? Não poderia ser um vetor com um tipo definido pelo usuário (Type)? Acho que seria muito mais simples, prático e tão rápido quanto.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Se você ver bem eu coloquei um delimitador que é o simbolo "@" usando a funcão split eu consigo separar cada item e adicionar ele na matriz

A não ser que eu faço para salvar o arquivo linha por linha ai acho que não tem erro.

Outra coisa tive notando outros programas quando salva um arquivo eles salvam em um formato que você não consegue reconhecer.

já no meu você abre com um editor de textos e ve o que ta escrito

Mesmo em binario

Eles criptografam os arquivos salvo?

Tem como fazer no VB?

Link para o comentário
Compartilhar em outros sites

  • 0

Se você ver bem eu coloquei um delimitador que é o simbolo "@" usando a funcão split eu consigo separar cada item e adicionar ele na matriz

Ah, mas não no código que você postou aqui. Ou então eu não estou "vendo bem". tongue.gif

A não ser que eu faço para salvar o arquivo linha por linha ai acho que não tem erro.

Sim, quase sempre eu faço isso.

Outra coisa tive notando outros programas quando salva um arquivo eles salvam em um formato que você não consegue reconhecer.

já no meu você abre com um editor de textos e ve o que ta escrito

Mesmo em binario

Sim, está certo. O lance de gravar em binário é para valores. Se você mandar ele gravar o valor 97 em um arquivo binário, aparecerá uma letra "a" no arquivo. E, se você mandar gravar um "a" vai dar no mesmo. Portanto, se você mandar gravar a palavra "teste" vai aparecer a palavra "teste" lá, porque é como se você mandasse gravar os valores referentes a cada uma das letras (116, 101, 115, 116 e 101). Já se você mandar gravar 1234 aparecerão dois caracteres que não são possíveis de serem mostrados aqui (chr(210) e chr(4)).

Eles criptografam os arquivos salvo?

Tem como fazer no VB?

Não, como eu disse acima, você deve estar olhando arquivos que são formados por uma longa sequência de valores, que na hora que são gravados são transformados em caracteres (repare que o número 1234 ocuparia 4 bytes do arquivo se fosse gravado literalmente, mas na verdade só ocupa 2 quando gravado como binário).

Entretanto, procure no fórum e você achará rotinas criptografia (inclusive esse assunto rolou hoje aqui no fórum também).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Ah, mas não no código que você postou aqui. Ou então eu não estou "vendo bem".

Ta ai sim, acho que você não viu mesmo biggrin.gif

De um CTRL+F e digite split ou @ e você verá

Bom valeu pela ajuda no fim terei que fazer como sempre fiz linha por linha cool.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Ah, mas não no código que você postou aqui. Ou então eu não estou "vendo bem".

Ta ai sim, acho que você não viu mesmo biggrin.gif

De um CTRL+F e digite split ou @ e você verá

Bom valeu pela ajuda no fim terei que fazer como sempre fiz linha por linha cool.gif

Quando eu respondi a sua mensagem com o texto:

""" Mas ai que ta você esta calculando como se cada dimensão dela tivesse apenas 1 caracter e na verdade poderia conter mais

tipo "ramon" tem 5 caracteres"""

Só tinha exatamente isso na mensagem e não aquele código imenso. E quando você falou do split com o @ eu fiz exatamente isso que você falou e não achei. Você não postou a mensagem pela metade e depois completou ela (editando)? Pois o que tinha no cache do meu navegador não incluia aquele código todo. Outro fato ainda é que sempre aperto o botão "Citar" que repete a sua mensagem (e eu não teria apagado aquele código imenso sem ter visto; aliás, por isso que não fiz o tal "teste" que você pediu).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Graymalkin fiz aqui para gravar em forma de texto e é super rapido tanto no salvar como no carregar.

Por que em binario é lento?

Existe uma outra maneira de se gravar e ler ou só tem em texto e binario?

Link para o comentário
Compartilhar em outros sites

  • 0

Graymalkin fiz aqui para gravar em forma de texto e é super rapido tanto no salvar como no carregar.

Por que em binario é lento?

Nunca percebi essa lentidão de que você fala. Frequentemente uso ambos os modos (texto e binário) e a velocidade de ambos depende da quantidade de dados a serem gravados.

Existe uma outra maneira de se gravar e ler ou só tem em texto e binario?

Não, só texto e binário mesmo, que eu saiba.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Bom ai vai então um exemplo de como fica lento em binario a leitura

Coloque 4 botoes e veja

Dim Clubes(20, 20, 13)
Dim caminho
Private Sub Command1_Click()

Open caminho For Binary As #1
Screen.MousePointer = 11
For A = 0 To 20
 For B = 0 To 20
  For C = 0 To 13
   Put #1, , Clubes(A, B, C)
  Next C
 Next B
Next A
Close #1
Screen.MousePointer = 0
MsgBox "Concluido a Gravação"
End Sub

Private Sub Command2_Click()
Open caminho For Binary As #1
Screen.MousePointer = 11
For A = 0 To 20
 For B = 0 To 20
  For C = 0 To 13
   dado = Space(LOF(1))
   Get #1, , dado
   Clubes(A, B, C) = dado
  Next C
 Next B
Next A
Close #1
Screen.MousePointer = 0
MsgBox "Concluido a Leitura"
End Sub

Private Sub Command3_Click()
Open caminho For Output As #1

For A = 0 To 20
 For B = 0 To 20
  For C = 0 To 13
  Print #1, Clubes(A, B, C)
  Next C
 Next B
Next A
Close #1
MsgBox "Concluido a Gravação"
End Sub

Private Sub Command4_Click()
Open caminho For Input As 1#

'Input #1, arquivo
For A = 0 To 20
 For B = 0 To 20
  For C = 0 To 13
   Clubes(A, B, C) = arquivo
   Input #1, arquivo
  Next C
 Next B
Next A
Close #1
MsgBox "Concluido a Leitura"
End Sub

Private Sub Form_Load()
For A = 0 To 20
 For B = 0 To 20
  For C = 0 To 13
   Clubes(A, B, C) = "abcdefghijlmnopqrstuv12354678989888888888"
  Next C
 Next B
Next A
caminho = (App.Path + "\teste.txt")
End Sub

Cara ve se consegue deixar rapido em binario este exemplo tanto na leitura como na gravacao

Link para o comentário
Compartilhar em outros sites

  • 0

Ainda não executei aqui, mas veja que...

dado = Space(LOF(1))
Get #1, , dado

... lê um caracter por vez. Lembra que eu não sabia como seus dados estavam organizados e que pensei que você queria fazer uma matriz de bytes? Pois bem, é isso que esse código aí faz, mas que acredito que não é o que você quer.

Daqui a pouco vou testar seu código para ver o que posso fazer.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Era exatamente o que falei acima. Veja os novos códigos dos Command1 e Command2:

Private Sub Command1_Click()

Open caminho For Binary As #1
Screen.MousePointer = 11
For A = 0 To 20
For B = 0 To 20
 For C = 0 To 13
  Put #1, , Clubes(A, B, C) & "@"
 Next C
Next B
Next A
Close #1
Screen.MousePointer = 0
MsgBox "Concluido a Gravação"
End Sub
Private Sub Command2_Click()
Open caminho For Binary As #1
dados = Split(Input(LOF(1), 1), "@")
Close #1
Screen.MousePointer = 11
i = 0

For A = 0 To 20
    For B = 0 To 20
        For C = 0 To 13
            Clubes(A, B, C) = dados(i)
            i = i + 1
        Next C
    Next B
Next A

Screen.MousePointer = 0
MsgBox "Concluido a Leitura"
End Sub

Ainda assim, realmente não fica mais rápido que o modo texto (mas fica *muito* mais rápido do que o anterior).

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Sim fica super rapido

Po ficou muito bom Graymalkin valeu cara biggrin.gif

Só tem um probleminha wink.gif

Quando a matrix recebe o dado recebe junto estes caractere " * "

Use o debug.print para você ver os dados da matrix

Teria algum jeito de não carregar aqueles caracteres

Tentei usar a funcao Mid mas não ficou legal pois tem partes do arquivo que não surge este caracteres

Ou então de não gravar aqueles caracteres? wink.gif

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...