Ir para conteúdo

Arquivado

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

karina pereira refacho

salvar arquivo grande txt usando fopen sem problema limite memoria

Recommended Posts

Pessoal gostaria de saber como faço para rodar o codigo abaixo no php sem  travar o navegador, pois o arquivo e grande e da problema de limite de memoria, nesse script irei gerar todas as hash de 1 até 500000000 e salvar em txt, como faço para o script gerar essas hash salvando em diversos arquivos txt de 50000 em 50000 ate finalizar todo o processo, detalhe ao salvar o arquivo txt teria que renomear o txt desse jeito exemplo 50000.txt, 100000.txt, 150000.txt ate terminar o total de 500000000 hash criadas,

obrigado pela atenção de todos segue codigo abaixo

<?php
// array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ..., 3000)
$temp = "\r\n";
$n=1;
foreach (range(1, 550000000) as $number) {
    $variavel = hash('sha512', $number);
		
	$n++;
	$file = fopen("/home/robson/Documentos/55000000.txt","a+");
fwrite ($file, $variavel = hash('sha512', $number).' = '.$temp );
if ($file == false) die('Não foi possível criar o arquivo.');
fclose($file);

}

?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo. Algumas sugestões:

 

1 - Suponho que você apenas quer que esses arquivos sejam gerados e isso não faça parte de uma aplicação web.

Se for esse o caso, execute via linha de comando. Não suba um servidor como Apache para fazer tarefas como essa. As diferenças de performance são grandes e muitas vezes o servidor web derruba seu script antes do final da execução, dependendo de como ele está configurado.

 

2 - Não faça isso: 

2 horas atrás, karina pereira refacho disse:

foreach (range(1, 550000000) as $number) {

Tanto o foreach quanto o range são ferramentas interessantes e eu sempre uso e recomendo, mas não no seu caso.

foreach é mais lento que outros loops e ao combinar com o range, você literalmente está criando um array com todas as posições do intervalo e depois percorrendo entre as posições do array. Haja memória e haja processamento para isso. Faça assim:

for ( $number = 1 ; $number <= 550000000 ; ++$number ) {

 

3 - Se você fizer esses 2 procedimentos você já conseguirá os arquivos que deseja, mas é uma tarefa demorada e você precisará aguardar. Uma sugestão é inserir um echo a cada 100k iterações, por exemplo, para que você possa acompanhar o progresso. Isso poderia ser feito assim:

if ( $number % 100000 === 0 )
    printf( "Passou por %d hashes.\n", $number );

Lembrando que você deveria rodar isso em CLI.

 

4 - Caso você queira esses arquivos produzidos muito mais rapidamente, use pthreads.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ola amigo desde ja agradeço sua resposta infelizmente eu preciso fazer isso no php mesmo pois faz parte de uma aplicação com resultado no final não posso usar outro sistema uma exemplo que se eu executar esse script com minha aplicação no windows com o xampp e no linux os resultados saem diferentes eu preciso dessa aplicação em php usado em linux mas não entendo muito a linguagem php se possivel voce me dar uma luz de como fazer isso em php agradeço.

 

obrigados a todos e tenham uma excelente semana

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 horas atrás, karina pereira refacho disse:

 

ola amigo desde ja agradeço sua resposta infelizmente eu preciso fazer isso no php mesmo pois faz parte de uma aplicação com resultado no final não posso usar outro sistema uma exemplo que se eu executar esse script com minha aplicação no windows com o xampp e no linux os resultados saem diferentes eu preciso dessa aplicação em php usado em linux mas não entendo muito a linguagem php se possivel voce me dar uma luz de como fazer isso em php agradeço.

 

obrigados a todos e tenham uma excelente semana

e também como eu faço para ele gravar os resultados em varios arquivos txt 50000 em 50000 ? sendo que ele salve cada arquivo aumentando também exemplo (50000.txt) (100000.txt) (150000.txt) e assim por diante ate chegar ao seu fim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Fernando Rafael
      Boa tarde, estou com um problema ao tentar usar o CMD para imprimir o conteúdo de um arquivo TXT, estou usando o comando:
       
      PRINT /d:"\\cxgeral\Brother HL-1210W series" "imprimir.txt"  
      A impressora responde e faz o processo de impressão, porém a página sai em branco, usando este mesmo comando em uma impressora de pedido (Daruma DR800, Epson T20X, Elgin i9) funciona normalmente. mas em uma impressora comum fica em branco, sei que as impressoras na qual deram certo permitem impressão escrevendo direto na porta na qual estão instaladas. Mas a minha "Brother Hl-1210W" é uma impressora laser A4.
       
      Agradeço pela atenção.
       
       
      visite: www.sisnorg.com
    • Por Jefferson andre
      Boa tarde, Estou com problemas ao utilizar o fopen, no localhost funciona corretamente mas ao subir para o site em vez de criar o arquivo em C:\nomedapasta ele cria na pasta que esta executando dentro do site.   Ja tentei colocar o caminho com duas barras mas mesmo assim nao esta funcionando. Segue o caminho que preciso criar o arquivo C:\CFe\123456\Envio\nomedoarq.xml   ja tentei isso acima assim C:\\CFe\\123456\\Envio\\nomedoarq.xml e nada   estou usando o comando assim: $destino = fopen($xdestino, 'w');   e entao vou colocando as escritas dentro dele com fwrite($destino, "escrita");   O que fazer ? ou pra qual comando mudar para escrever um xml ?
    • Por Gilberto Jr
      Olá, boa tarde.
      Tudo bem?
       
      Preciso de uma ajuda aqui.
       
      Seguinte, através desse código eu consigo ler as informações que esta dentro do arquivo txt.
      <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> <title>FileAPI HTML5</title> <style type="text/css"> #filecontents { border: double; overflow-y: scroll; height: 400px; } </style> </head> <body> Por favor selecione arquivo que será lido:<br /> <input type="file" id="txtfiletoread" /><br /> <div>Conteúdo do arquivo:</div> <div id="filecontents"> </div> <script> window.onload = function () { //Check the support for the File API support if (window.File && window.FileReader && window.FileList && window.Blob) { var fileSelected = document.getElementById('txtfiletoread'); fileSelected.addEventListener('change', function (e) { //Set the extension for the file var fileExtension = /text.*/; //Get the file object var fileTobeRead = fileSelected.files[0]; //Check of the extension match if (fileTobeRead.type.match(fileExtension)) { //Initialize the FileReader object to read the 2file var fileReader = new FileReader(); fileReader.onload = function (e) { var pontovirgula = ";"; var virgula = ","; var fileContents = document.getElementById('filecontents'); fileContents.innerText = fileReader.result.replace(virgula, pontovirgula).replace(virgula, pontovirgula); } fileReader.readAsText(fileTobeRead); } else { alert("Por favor selecione arquivo texto"); } }, false); } else { alert("Arquivo(s) não suportado(s)"); } } </script> </body> </html> So que o arquivo vem separado por virgulas. Eu quero substituir todas as virgulas por ponto e virgula. Se eu usar dessa forma, ele altera a virgula para ponto e virgula da primeira linha.
      <script> window.onload = function () { //Check the support for the File API support if (window.File && window.FileReader && window.FileList && window.Blob) { var fileSelected = document.getElementById('txtfiletoread'); fileSelected.addEventListener('change', function (e) { //Set the extension for the file var fileExtension = /text.*/; //Get the file object var fileTobeRead = fileSelected.files[0]; //Check of the extension match if (fileTobeRead.type.match(fileExtension)) { //Initialize the FileReader object to read the 2file var fileReader = new FileReader(); fileReader.onload = function (e) { var pontovirgula = ";"; var virgula = ","; var fileContents = document.getElementById('filecontents'); fileContents.innerText = fileReader.result.replace(virgula, pontovirgula).replace(virgula, pontovirgula); } fileReader.readAsText(fileTobeRead); } else { alert("Por favor selecione arquivo texto"); } }, false); } else { alert("Arquivo(s) não suportado(s)"); } } </script> 7909377852089;1;8380 7909377852133,1,8380 7909377820729,2,8380 7909377820736,2,8380 7909377820743,2,8380 E também, o ultimo valor eu preciso separar os centavos por , virgula.
       
      Arquivo deve ficar dessa forma quando mostrado na pagina.
       
      7909377852089;1;83,80
      7909377852133;1;83,80
      7909377820729;2;83,80
      7909377820736;2;83,80
      7909377820743;2;83,80
       
      Ou seja, contando da direita para esquerda, as duas primeiras posições é o centavos.
       
      Se alguém puder me ajudar, ficarei muito grato.
       
      Att;
      Gilberto Jr
    • Por pandinha_000
      Olá,
      Estou desenvolvendo um código em c++ utilizando manipulação de arquivos .txt (não por ponteiros), e gostaria de saber como fazer para que o algoritmo "pule" a primeira linha em branco do meu arquivo e passe já para a próxima, com dados válidos (na leitura). A propósito, existe a possibilidade de, ao escrever no arquivo, essa primeira linha em branco não exista?
      Desde já agradeço.
    • Por Daniel Tenorio
      Saudações amigos,
      Minha tabela possui um campo numérico “peso”
      Preciso ler um arquivo txt que está na minha máquina e que contém apenas uma linha com o peso no formato “999999”. Preciso atribuir esse valor no campo do formulário.
      Um detalhe, eu preciso que funcione sem ação do usuário para selecionar o arquivo na pasta, ou seja, que o valor seja atribuído automaticamente ao campo, porém para isso, eu preciso colocar dentro do código (em uma variável) o caminho do arquivo. Ou ao menos se alguém conseguir fazer que funcione com um botão ao lado do campo com a ação do usuário apenas para clicar no botão retornando o valor do txt ao campo já ajudaria muito.
      Consegui fazer o código em anexo funcionar, porém gostaria do preenchimento automático do campo.

×

Informação importante

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