Dúvida no funcionamento da biblioteca E/S

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Dúvida no funcionamento da biblioteca E/S

Ulisses Piassa
Bom dia galera,

Antes de tudo, feliz 2017 à todos! Muitas bençãos à todos e às suas famílias neste ano que está começando!

Estou com uma dúvida no funcionamento da biblioteca E/S... Quando entro com o seguinte código:

local arquivoHandler = io.open(path, "rb")

1     if (arquivoHandler) then
2      
3       local strArq
4       local arquivoNum = 1
5       local acc = 0
6       local inicioDoArquivo = true
7       local novoArquivo
8       
9       while true do
10        
11        if (inicioDoArquivo) then
12          novoArquivo = io.open(string.format('%s0%d.lua', PATH, arquivoNum), 'w+')
13          inicioDoArquivo = false
14        end
15        
16        strArq arquivoHandler:read('*L')
17
18        if (strArq == nil) then
19          novoArquivo:close()
20          arquivoHandler:close()
21          break
22        end
23        
24        local fimString = string.find(strArq, '%}%}%,')
25        
26        if (fimString) then
27          if (acc < 79) then
28            novoArquivo:write(strArq)
29            acc = acc + 1
30          else
31            novoArquivo:write(strArq)
32            novoArquivo:close()
33            inicioDoArquivo = true
34            arquivoNum = arquivoNum + 1
35            acc = 1
36          end
37        end
38      end

Estou trabalhando num ambiente embarcado o qual vai receber um arquivo do servidor. No caso, estou usando o arquivoHandler:read('*L') (conforme linha 16) para que o script leia o arquivo linha a linha até o \n.

Uma vez que a memória RAM da qual o ambiente dispõe é bastante baixa, minha intenção maior em usar o ('*L') é que o script leia o arquivo uma linha de cada vez, e escreva uma linha de cada vez no novo handler de arquivo - novoArquivo:write(strArq), linha 31.

Minha dúvida é: Ao usar o file:read('*L'), essa leitura é feita linha após linha mesmo? Estou tendo um problema de estouro de memória quando executo essa lógica, e o erro ocorre justamente quando o script chega na linha 16.

Por isso tenho dúvidas se estou lendo o arquivo da forma que quero ou se estou fazendo o script ler o arquivo completo, o que termina por enchere a RAM e causar o Overflow.

Gostaria de saber se estou utilizando a biblioteca corretamente, ou se há alguma forma de amenizar a utilização de RAM quando uso a biblioteca E/S

Agradeço à todos!!

[]'s,

Ulisses

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Dúvida no funcionamento da biblioteca E/S

Diogo Mildenberger
Não sei se a opção *l não é case-sensitive, talvez seja isso... Outra opção é usar io.lines().

Diogo

Em 3 de jan de 2017 11:23, "Ulisses Piassa" <[hidden email]> escreveu:
Bom dia galera,

Antes de tudo, feliz 2017 à todos! Muitas bençãos à todos e às suas famílias neste ano que está começando!

Estou com uma dúvida no funcionamento da biblioteca E/S... Quando entro com o seguinte código:

local arquivoHandler = io.open(path, "rb")

1     if (arquivoHandler) then
2      
3       local strArq
4       local arquivoNum = 1
5       local acc = 0
6       local inicioDoArquivo = true
7       local novoArquivo
8       
9       while true do
10        
11        if (inicioDoArquivo) then
12          novoArquivo = io.open(string.format('%s0%d.lua', PATH, arquivoNum), 'w+')
13          inicioDoArquivo = false
14        end
15        
16        strArq arquivoHandler:read('*L')
17
18        if (strArq == nil) then
19          novoArquivo:close()
20          arquivoHandler:close()
21          break
22        end
23        
24        local fimString = string.find(strArq, '%}%}%,')
25        
26        if (fimString) then
27          if (acc < 79) then
28            novoArquivo:write(strArq)
29            acc = acc + 1
30          else
31            novoArquivo:write(strArq)
32            novoArquivo:close()
33            inicioDoArquivo = true
34            arquivoNum = arquivoNum + 1
35            acc = 1
36          end
37        end
38      end

Estou trabalhando num ambiente embarcado o qual vai receber um arquivo do servidor. No caso, estou usando o arquivoHandler:read('*L') (conforme linha 16) para que o script leia o arquivo linha a linha até o \n.

Uma vez que a memória RAM da qual o ambiente dispõe é bastante baixa, minha intenção maior em usar o ('*L') é que o script leia o arquivo uma linha de cada vez, e escreva uma linha de cada vez no novo handler de arquivo - novoArquivo:write(strArq), linha 31.

Minha dúvida é: Ao usar o file:read('*L'), essa leitura é feita linha após linha mesmo? Estou tendo um problema de estouro de memória quando executo essa lógica, e o erro ocorre justamente quando o script chega na linha 16.

Por isso tenho dúvidas se estou lendo o arquivo da forma que quero ou se estou fazendo o script ler o arquivo completo, o que termina por enchere a RAM e causar o Overflow.

Gostaria de saber se estou utilizando a biblioteca corretamente, ou se há alguma forma de amenizar a utilização de RAM quando uso a biblioteca E/S

Agradeço à todos!!

[]'s,

Ulisses

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Dúvida no funcionamento da biblioteca E/S

Denis Dos Santos Silva
In reply to this post by Ulisses Piassa

Diogo: você está certo é case-sensitive, pelo menos, no lua 5.1.5.


Ulisses: a observação do Diogo também é valida sobre "iterar" o arquivo linha-a-linha


p.ex.,


--
--
--
local arquivo = 'file.txt';

file = io.open( arquivo , "r")
for line in file:lines() do print(line) end
[,,,]
file:close()

--
-- <<EOF>>
--

--






Em terça-feira, 3 de janeiro de 2017 10:23:15 UTC-3, Ulisses Piassa escreveu:
Bom dia galera,

Antes de tudo, feliz 2017 à todos! Muitas bençãos à todos e às suas famílias neste ano que está começando!

Estou com uma dúvida no funcionamento da biblioteca E/S... Quando entro com o seguinte código:

local arquivoHandler = io.open(path, "rb")

1     if (arquivoHandler) then
2      
3       local strArq
4       local arquivoNum = 1
5       local acc = 0
6       local inicioDoArquivo = true
7       local novoArquivo
8       
9       while true do
10        
11        if (inicioDoArquivo) then
12          novoArquivo = io.open(string.format('%s0%d.lua', PATH, arquivoNum), 'w+')
13          inicioDoArquivo = false
14        end
15        
16        strArq arquivoHandler:read('*L')
17
18        if (strArq == nil) then
19          novoArquivo:close()
20          arquivoHandler:close()
21          break
22        end
23        
24        local fimString = string.find(strArq, '%}%}%,')
25        
26        if (fimString) then
27          if (acc < 79) then
28            novoArquivo:write(strArq)
29            acc = acc + 1
30          else
31            novoArquivo:write(strArq)
32            novoArquivo:close()
33            inicioDoArquivo = true
34            arquivoNum = arquivoNum + 1
35            acc = 1
36          end
37        end
38      end

Estou trabalhando num ambiente embarcado o qual vai receber um arquivo do servidor. No caso, estou usando o arquivoHandler:read('*L') (conforme linha 16) para que o script leia o arquivo linha a linha até o \n.

Uma vez que a memória RAM da qual o ambiente dispõe é bastante baixa, minha intenção maior em usar o ('*L') é que o script leia o arquivo uma linha de cada vez, e escreva uma linha de cada vez no novo handler de arquivo - novoArquivo:write(strArq), linha 31.

Minha dúvida é: Ao usar o file:read('*L'), essa leitura é feita linha após linha mesmo? Estou tendo um problema de estouro de memória quando executo essa lógica, e o erro ocorre justamente quando o script chega na linha 16.

Por isso tenho dúvidas se estou lendo o arquivo da forma que quero ou se estou fazendo o script ler o arquivo completo, o que termina por enchere a RAM e causar o Overflow.

Gostaria de saber se estou utilizando a biblioteca corretamente, ou se há alguma forma de amenizar a utilização de RAM quando uso a biblioteca E/S

Agradeço à todos!!

[]'s,

Ulisses

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Dúvida no funcionamento da biblioteca E/S

Ulisses Piassa
In reply to this post by Diogo Mildenberger
Diogo, na referência consta que existem as opções *L e *l, que incluem o \n na leitura ou não o incluem, respectivamente. O io.lines não sei se funcionaria pro que quero: Quero pegar um arquivo com 250 linhas e a partir dele montar vários arquivos de no máximo 80 linhas cada.

Valeu!

2017-01-03 14:02 GMT-02:00 Diogo Mildenberger <[hidden email]>:
Não sei se a opção *l não é case-sensitive, talvez seja isso... Outra opção é usar io.lines().

Diogo

Em 3 de jan de 2017 11:23, "Ulisses Piassa" <[hidden email]> escreveu:
Bom dia galera,

Antes de tudo, feliz 2017 à todos! Muitas bençãos à todos e às suas famílias neste ano que está começando!

Estou com uma dúvida no funcionamento da biblioteca E/S... Quando entro com o seguinte código:

local arquivoHandler = io.open(path, "rb")

1     if (arquivoHandler) then
2      
3       local strArq
4       local arquivoNum = 1
5       local acc = 0
6       local inicioDoArquivo = true
7       local novoArquivo
8       
9       while true do
10        
11        if (inicioDoArquivo) then
12          novoArquivo = io.open(string.format('%s0%d.lua', PATH, arquivoNum), 'w+')
13          inicioDoArquivo = false
14        end
15        
16        strArq arquivoHandler:read('*L')
17
18        if (strArq == nil) then
19          novoArquivo:close()
20          arquivoHandler:close()
21          break
22        end
23        
24        local fimString = string.find(strArq, '%}%}%,')
25        
26        if (fimString) then
27          if (acc < 79) then
28            novoArquivo:write(strArq)
29            acc = acc + 1
30          else
31            novoArquivo:write(strArq)
32            novoArquivo:close()
33            inicioDoArquivo = true
34            arquivoNum = arquivoNum + 1
35            acc = 1
36          end
37        end
38      end

Estou trabalhando num ambiente embarcado o qual vai receber um arquivo do servidor. No caso, estou usando o arquivoHandler:read('*L') (conforme linha 16) para que o script leia o arquivo linha a linha até o \n.

Uma vez que a memória RAM da qual o ambiente dispõe é bastante baixa, minha intenção maior em usar o ('*L') é que o script leia o arquivo uma linha de cada vez, e escreva uma linha de cada vez no novo handler de arquivo - novoArquivo:write(strArq), linha 31.

Minha dúvida é: Ao usar o file:read('*L'), essa leitura é feita linha após linha mesmo? Estou tendo um problema de estouro de memória quando executo essa lógica, e o erro ocorre justamente quando o script chega na linha 16.

Por isso tenho dúvidas se estou lendo o arquivo da forma que quero ou se estou fazendo o script ler o arquivo completo, o que termina por enchere a RAM e causar o Overflow.

Gostaria de saber se estou utilizando a biblioteca corretamente, ou se há alguma forma de amenizar a utilização de RAM quando uso a biblioteca E/S

Agradeço à todos!!

[]'s,

Ulisses

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Dúvida no funcionamento da biblioteca E/S

Denis Dos Santos Silva
In reply to this post by Ulisses Piassa

no arquivo liolib.c é case-sensitive (lua 5.1.5), como não uso outras versões, não pude verificar.


o uso de iterator essa característica de 'lazy load'






Em terça-feira, 3 de janeiro de 2017 10:23:15 UTC-3, Ulisses Piassa escreveu:
Bom dia galera,

Antes de tudo, feliz 2017 à todos! Muitas bençãos à todos e às suas famílias neste ano que está começando!

Estou com uma dúvida no funcionamento da biblioteca E/S... Quando entro com o seguinte código:

local arquivoHandler = io.open(path, "rb")

1     if (arquivoHandler) then
2      
3       local strArq
4       local arquivoNum = 1
5       local acc = 0
6       local inicioDoArquivo = true
7       local novoArquivo
8       
9       while true do
10        
11        if (inicioDoArquivo) then
12          novoArquivo = io.open(string.format('%s0%d.lua', PATH, arquivoNum), 'w+')
13          inicioDoArquivo = false
14        end
15        
16        strArq arquivoHandler:read('*L')
17
18        if (strArq == nil) then
19          novoArquivo:close()
20          arquivoHandler:close()
21          break
22        end
23        
24        local fimString = string.find(strArq, '%}%}%,')
25        
26        if (fimString) then
27          if (acc < 79) then
28            novoArquivo:write(strArq)
29            acc = acc + 1
30          else
31            novoArquivo:write(strArq)
32            novoArquivo:close()
33            inicioDoArquivo = true
34            arquivoNum = arquivoNum + 1
35            acc = 1
36          end
37        end
38      end

Estou trabalhando num ambiente embarcado o qual vai receber um arquivo do servidor. No caso, estou usando o arquivoHandler:read('*L') (conforme linha 16) para que o script leia o arquivo linha a linha até o \n.

Uma vez que a memória RAM da qual o ambiente dispõe é bastante baixa, minha intenção maior em usar o ('*L') é que o script leia o arquivo uma linha de cada vez, e escreva uma linha de cada vez no novo handler de arquivo - novoArquivo:write(strArq), linha 31.

Minha dúvida é: Ao usar o file:read('*L'), essa leitura é feita linha após linha mesmo? Estou tendo um problema de estouro de memória quando executo essa lógica, e o erro ocorre justamente quando o script chega na linha 16.

Por isso tenho dúvidas se estou lendo o arquivo da forma que quero ou se estou fazendo o script ler o arquivo completo, o que termina por enchere a RAM e causar o Overflow.

Gostaria de saber se estou utilizando a biblioteca corretamente, ou se há alguma forma de amenizar a utilização de RAM quando uso a biblioteca E/S

Agradeço à todos!!

[]'s,

Ulisses

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Dúvida no funcionamento da biblioteca E/S

Ulisses Piassa
Denis obrigado pelas orientações... Ajudaram bastante!

Consegui resolver a situação de outra forma, mas o uso do io.lines() teve um resultado muito bom!

Quanto ao *l e o *L, esqueci de mencionar no e-mail anterior... Estou usando o Lua 5.2.

Vlwwww!!


[]'s

Ulisses

2017-01-03 17:53 GMT-02:00 Denis Dos Santos Silva <[hidden email]>:

no arquivo liolib.c é case-sensitive (lua 5.1.5), como não uso outras versões, não pude verificar.


o uso de iterator essa característica de 'lazy load'






Em terça-feira, 3 de janeiro de 2017 10:23:15 UTC-3, Ulisses Piassa escreveu:
Bom dia galera,

Antes de tudo, feliz 2017 à todos! Muitas bençãos à todos e às suas famílias neste ano que está começando!

Estou com uma dúvida no funcionamento da biblioteca E/S... Quando entro com o seguinte código:

local arquivoHandler = io.open(path, "rb")

1     if (arquivoHandler) then
2      
3       local strArq
4       local arquivoNum = 1
5       local acc = 0
6       local inicioDoArquivo = true
7       local novoArquivo
8       
9       while true do
10        
11        if (inicioDoArquivo) then
12          novoArquivo = io.open(string.format('%s0%d.lua', PATH, arquivoNum), 'w+')
13          inicioDoArquivo = false
14        end
15        
16        strArq arquivoHandler:read('*L')
17
18        if (strArq == nil) then
19          novoArquivo:close()
20          arquivoHandler:close()
21          break
22        end
23        
24        local fimString = string.find(strArq, '%}%}%,')
25        
26        if (fimString) then
27          if (acc < 79) then
28            novoArquivo:write(strArq)
29            acc = acc + 1
30          else
31            novoArquivo:write(strArq)
32            novoArquivo:close()
33            inicioDoArquivo = true
34            arquivoNum = arquivoNum + 1
35            acc = 1
36          end
37        end
38      end

Estou trabalhando num ambiente embarcado o qual vai receber um arquivo do servidor. No caso, estou usando o arquivoHandler:read('*L') (conforme linha 16) para que o script leia o arquivo linha a linha até o \n.

Uma vez que a memória RAM da qual o ambiente dispõe é bastante baixa, minha intenção maior em usar o ('*L') é que o script leia o arquivo uma linha de cada vez, e escreva uma linha de cada vez no novo handler de arquivo - novoArquivo:write(strArq), linha 31.

Minha dúvida é: Ao usar o file:read('*L'), essa leitura é feita linha após linha mesmo? Estou tendo um problema de estouro de memória quando executo essa lógica, e o erro ocorre justamente quando o script chega na linha 16.

Por isso tenho dúvidas se estou lendo o arquivo da forma que quero ou se estou fazendo o script ler o arquivo completo, o que termina por enchere a RAM e causar o Overflow.

Gostaria de saber se estou utilizando a biblioteca corretamente, ou se há alguma forma de amenizar a utilização de RAM quando uso a biblioteca E/S

Agradeço à todos!!

[]'s,

Ulisses

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.