Ir para conteúdo
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);

}

?>

 

Editado por karina pereira refacho
erro escrita titulo

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.

  • Gostei 1

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

Editado por Matheus Tavares
Remover citação desnecessária

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Lenon John
      Eu preciso inserir mais de 3000 itens no ArrayList, o que gera o erro: method code too large.
      Acredito que usando um TXT como "BANCO DE DADOS" vai resolver o meu problema.
       
      Atualmente eu faço assim:
      -----------------------------------------------------
      ArrayList lista = new ArrayList();

      // inserindo os itens no ArrayList
      lista.add(new produtoItem(R.drawable.imagem, "AA", "AA", "AA", "AA"));

      adapter = new produtoAdapter(this, lista);
      ListView listView = (ListView) findViewById(R.id.listView1);
      listView.setAdapter(adapter);
      -----------------------------------------------------
       
      Como pegar os dados de um TXT e inserir no meu arrayList?

      OBS: Esse APP precisa funcionar sem a necessidade de internet. Ou seja, não posso usar um banco dados externo.
    • Por avelar.avelar
      Galera, estou tentando pegar de um arquivo TXT, 4 informacoes que cada linha dele da e gravar numa tabela do banco de dados, e esta dando erro e já mexi e remexi e não sei pq nao da certo, alguem poderias me ajudar?

      processa.php
      <?php
      session_start();
      //Incluir a conexao com BD
      include_once("conexao.php");
      //Receber os dados do formulário
      //$arquivo = $_FILES['arquivo'];
      //var_dump($arquivo);
      $arquivo_tmp = $_FILES['arquivo']['tmp_name'];
      //ler todo o arquivo para um array
      $dados = file($arquivo_tmp);
      //var_dump($dados);
                          $line = fgets($dados);
                         for($x=0; $x<0; $x++) {
                              $line = fgets($dados);
                          }
                          $ArrayRetornogru = array();
                          echo "dados".$dados;
                          echo "line". $line;
                          break;
                          
                          
                          while ($line = fgets($dados)) {
                                      
                                  $data_vencto = substr($line, 56,8);
                                  $data_pago = substr($line, 101,8);
                                  $valor          = substr($line, 122,4);
                                  $cpf  = substr($line, 256,11);
                                  // captar as 3 variaveis e fazer a busca das inscricoes pelo cpf data e valor
                                  echo $data_pago;
                                  echo $data_vencto;
                                  echo $valor;
                              $nbr_cpf = $cpf;
                              $parte_um     = substr($nbr_cpf, 0, 3);
                              $parte_dois   = substr($nbr_cpf, 3, 3);
                              $parte_tres   = substr($nbr_cpf, 6, 3);
                              $parte_quatro = substr($nbr_cpf, 9, 2);
                              $monta_cpf = "$parte_um.$parte_dois.$parte_tres-$parte_quatro";
                              echo $monta_cpf;
                               $ArrayRetornogru[] = $monta_cpf;
                                   
                                      echo "<pre>";
                                          print_r($ArrayRetornogru);
                                      echo "</pre>";
                                      echo "TESTE";
                                      
                          }
                          fclose($dados);
                          print_r($ArrayRetornogru);
                          echo "teste 2";
                          break;
                          
                          
      foreach($dados as $linha){
          $linha = trim($linha);
          $valor = explode(',', $linha);
          var_dump($valor);
          
          $data_vencto = $ArrayRetornogru[0];
          $data_pago = $ArrayRetornogru[1];
          $valor = $ArrayRetornogru[2];
          $cpf = $ArrayRetornogru[3];
          
          $result_usuario = "INSERT INTO gru_concurso (data_vencto, data_pago, valor, cpf) VALUES ('$data_vencto', '$data_pago', '$valor', '$cpf')";
          
          $resultado_usuario = mysqli_query($conn, $result_usuario);    
      }
      $_SESSION['msg'] = "<p style='color: green;'>Carregado os dados com sucesso!</p>";
      header("Location: index.php");
       
      ARQUIVO TXT:
       

       
      de cada linha eu preciso tirar as informacoes datavencto, datapago, valor, cpf e gravar numa tabela a parte.
       
      Falow galera !!!
       
       
       
    • Por Augusto A.S
      Boa noite, sou novo aqui no fórum, estou tentando fazer um sistema de comentários para um site, e minha dúvida é a seguinte:
       
      Como faço para, através do "f" (fopen, fwrite...), escrever um conteúdo no meio de um arquivo html?
       
      O código que fiz escreve apenas no final do arquivo, o que causa problemas, pois o texto escrito se trata de uma tag <li></li> que deverá ser colocado dentro de uma tag <ul></ul>, a qual se localiza na tag <html></html>, no arquivo "comentario.html". Porém, no código que fiz, está escrevendo fora da tag <html></html>.
    • Por lucThony
      Ola, estou com um problema no meu codigo php na função fopen. Tenho 3 input de imagens, porem so o primeiro esta salvando o arquivo, os outros 2 não gravam. Segue:

      HTML
      </div> <div class="row 50%">                                          <input  name="arquivo" accept="image/*" capture="camera" onchange="document.getElementById('submitc').click();" type="file" /><br>                                                                                     </div> <div class="row 50%"> <input  name="arquivo2" accept="image/*" capture="camera" onchange="document.getElementById('submitc').click();" type="file"/><br> </div> <div class="row 50%">                                             <input  name="arquivo3" accept="image/*" capture="camera" onchange="document.getElementById('submitc').click();" type="file"/> </div> PHP
          $data = date('d-m-Y');     $data .= ' '.date('H:i:s');     $titulo="NOVA $nome";     $file_tmp_name    = $_FILES['arquivo']['tmp_name'];     $file_name        = $_FILES['arquivo']['name'];     $file_size        = $_FILES['arquivo']['size'];     $file_type        = $_FILES['arquivo']['type'];     $file_error       = $_FILES['arquivo']['error'];     $handle=fopen($file_tmp_name, "r");     $conteudo=fread($handle, $file_size);     fclose($handle);     $destiny=("PAINEL/$nome$condominio$data.png");     move_uploaded_file($file_tmp_name, $destiny);              $titulo2="NOVA $nome";     $file_tmp_name2    = $_FILES['arquivo2']['tmp_name2'];     $file_name2       = $_FILES['arquivo2']['name2'];     $file_size2        = $_FILES['arquivo2']['size2'];     $file_type2        = $_FILES['arquivo2']['type2'];     $file_error2       = $_FILES['arquivo2']['error2'];     $handle2=fopen($file_tmp_name2, "r");     $conteudo2=fread($handle2, $file_size2);     fclose($handle2);     $destiny2=("PAINEL/ARQ2/$nome$data$condominio.png");     move_uploaded_file($file_tmp_name2, $destiny2);          $titulo3="NOVA $nome";     $file_tmp_name3    = $_FILES['arquivo3']['tmp_name'];     $file_name3        = $_FILES['arquivo3']['name'];     $file_size3        = $_FILES['arquivo3']['size'];     $file_type3        = $_FILES['arquivo3']['type'];     $file_error3       = $_FILES['arquivo3']['error'];     $handle3=fopen($file_tmp_name3, "r");     $conteudo3=fread($handle, $file_size3);     fclose($handle3);     $destiny3=("PAINEL/ARQ3/$data$nome$condominio.png");     move_uploaded_file($file_tmp_name3, $destiny3);  
       
    • Por Hozana
      Ola, bom dia!!
      pessoal preciso de ajuda!
       
      tenho a seguinte lista criada no html, ela não esta completa, só p vcs entenderem.
       
      <ul class="lista">                                            
                              <li>Datetime:</li>
                              <li>Velocidade:</li> 
                              <li>$ Inicial:</li> 
                              <li>$ Atual: </li>
                              <li>$ Financ: </li>
                              <li>% Neil: </li> 
                              <li>% Financ: </li> 
                              <li>% Ultimo: </li> 
                              <li>Estado: </li> 
                              <li>QDT Trade: </li> 
       
      e tenho no JS isso( peguei em um tutorial, e acho que é disso que eu preciso
       
      var numsList = [];
      $.ajax( 'Input.txt', {
          dataType: 'text',
          success: function(response){
              //response é o conteudo do Input.txt
              var lines = response.split('\n'); //quebra o arquivo em linhas, 
              for(var i in lines){
                  var row = lines;
                  var nums = row.split(','); //quebra a linha em valores separdos por virgula
                  for(var j in nums){
                      var num = parseInt(nums[j]); //converte o valor para int
                      if( !isNaN(num) ) //basicamente verifica se é um numero
                          numsList.push(num); //adiciona o item no array
                  }}
              console.log(numsList);
          }
      });
       
      Tenho também um arquivo txt(Input.txt) com algumas informações separadas por virgula.
      O que quero é alimentar a lista com as informações do arquivo txt, mas coloca-los na posição correta
       
      por exemplo
      eu Tenho o 1º item da lista Datatime:  e dentro dele quero colocar o primeiro item do arquivo
      mas não sei como chamar o JS  no HTML.
       
       
      Desde ja Obrigada.
×

Informação importante

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