Jump to content
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);

}

?>

 

Edited by karina pereira refacho
erro escrita titulo

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Edited by Matheus Tavares
Remover citação desnecessária

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By 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.

    • By felipems98
      Olá, esse e meu primeiro post no forum, estou com problema para manipular dados recebidos de um arquivo
      Eu quero capturar esses dados e salvar em um variavel, podem com o fgets() eu so consigo printar na tela pois quando vai passar pra outra variavel ele so pega o ultimo caracter.
      Segue a baixo o codigo:
      void main(){ FILE *pont_arquivo; char caminho[100]; char tx[100]; //char c; char texto[100]; int i; //define e abre o arquivo que será formatado printf("coloque o caminho do arquivo que queira abrir\n"); gets(caminho); pont_arquivo = fopen(caminho, "r"); if (pont_arquivo == NULL){ printf ("ERRO: arquivo não encontrado ou sem permissão de acesso.\n"); exit(0); } printf("arquivo aberto.\n"); while(fgets(tx, 100, pont_arquivo) != NULL){ for( i=0; i< sizeof(tx); i++) texto[i] = tx[i]; } fclose(pont_arquivo); printf("%s", texto); } O print consegue retornar todos os valores do arquivo mas não consigo passar eles para uma variável e tratar dentro do código.
      ja tentei com strcpy e esse exemplo eu mandei com for pra atribuir um a um os dados, mas não consegui com nenhum dos dois.
      A baixo tem os dados do arquivo txt:
      teste{ sjdoasijd,xy jsioadja,xy jsiadj,xy ois,xy djsia,xy dijodajsi,xy jiosjodia,xy jbf23,xy 21,xy 21983,xy moisdoia,xy mh8293,xy ajksnd,xy ioaasd,xy }  
    • By lucasseribeiro
      Olá fórum...
      Estou pedindo ajuda aos universitários!
       
      No terminal, com "php -a",  ele funciona bem... Estou usando o Manual do PHP:
      https://www.php.net/manual/pt_BR/function.fwrite.php
       
      Uso o primeiro exemplo das notas... Parece problema de permissões, mas tô boiando quanto onde  mexer nas permissões. No Apache2?! Nunca precisei mexer nos arquivos de configuração do Apache, sempre foi só gerar links simbólicos pelo terminal em /var/www/html, com os alvos dos links numa pasta "oficina" na minha pasta pessoal, e recarregar o navegador.
       
      Mas agora, criei um index.php geral com links para cada projeto, criei um arquivo que funciona como um "index.php individual do projeto" mas com outro nome com o HTML, e outro  com as funções PHP e, nele, uma função com as fopen() e fwrite() do primeiro exemplo das notas do Manual do PHP, sem parâmetros e echos sinalizando a execução.
       
      Chamei a função no index individual que dava include para o arquivo da função. Recarrego a página com F5 e os echos funcionam bem, mas os arquivos que deveriam ser criados não. Quando volto no arquivo das funções, o fopen() e o fwrite() estão rindo de mim!
       
      Já tentei com eles pelados, sem função, com path relativo no caminho do arquivo, aspas duplas, até um comentário antes fazendo //cuti cuti... Mas acabo de notar que estou fazendo os alvos dos links em /var, tentarem criar arquivos em /var, sem permissões de root...
       
      Vou manter o tópico em aberto por via das dúvidas, e se resolver marco como "resolvido" reportando aos demais usuários, para contribuir...
       
      Grato
      Lucas Ribeiro
    • By heddyman
      pessoal bom dia,
       
       tenho esse algoritmo pra terminar e não consigo implementar o comando fopen (o nome do arquivo que criei é dados.txt)no meu código para não precisar ficar digitando as informações toda vez que precisar executar a função de pesquisa.. se houver mais algum problema no código ficarei grato se me orientarem.. podem me ajudar ??? 
      #include<stdio.h> #include<stdlib.h> #include<string.h> #define SIZE 200 // declaracao das funcoes void cadastro(); //cadastro void pesquisa();// pesquisa void liberarmem();// liberar a memória usada // variaveis globais int op; int c; typedef struct aluno { int ru; char nome[45]; char email[60]; struct aluno * proximo; // declaracao da estrutura da lista } t_cad; t_cad *ini_cad = NULL; // variavel global que ira armazenar o inicio da lista encadeada int main(int argc, char *argv[]) { printf(" ALGORITIMO DE LISTA ENCADEADA SIMPLES - Hedson Ferreira R.U. 2411288\n\n Analise e Desenvolvimento de Sistemas - Uninter 2019\n\n"); do { printf("*========================*\n"); printf("| Escolha uma opcao |\n"); printf("| 1. Cadastrar Aluno |\n"); printf("| 2. Pesquisar Aluno |\n"); printf("| 3. Sair |\n"); printf("*========================*\n"); scanf_s("%d", &op); switch (op) { case 1: cadastro(); break; case 2: pesquisa(); break; case 3: system("exit"); break; default: printf("Opcao Invalida..."); break; } } while (op != 3); void liberarmem(); return 0; } void cadastro() { int cont; int c; t_cad* prox_cad; if (ini_cad == NULL) { ini_cad = (t_cad*)malloc(sizeof(t_cad)); ini_cad->proximo = NULL; if (ini_cad == NULL) exit(1); } prox_cad = ini_cad; while (1) { printf("Digite o RU:"); scanf_s("%d", &prox_cad->ru); while ((c = getchar()) != '\n' && c != EOF); printf("Digite o Nome:"); gets_s(prox_cad->nome); while ((c = getchar()) != '\n' && c != EOF); printf("Digite o email:"); gets_s(prox_cad->email); while ((c = getchar()) != '\n' && c != EOF); printf("Deseja continuar??? (1)SIM e (0)NAO"); scanf_s("\n %d", &cont); while ((c = getchar()) != '\n' && c != EOF); if (cont == 0) break; prox_cad->proximo = (t_cad *)malloc(sizeof(t_cad)); prox_cad = prox_cad->proximo; prox_cad->proximo = NULL; } printf("\n"); } void pesquisa() { int ru_aux; char nome_aux[60]; t_cad* prox_cad; do { printf("\n Ecolha o parametro da pesquisa: \n1 RU \n2 Nome :\n0 para sair\n"); scanf_s("%d", &op); if (op == 0) break; prox_cad = ini_cad; switch (op) { case 1: printf("\n Digite o RU do Aluno:"); scanf_s("%d", &ru_aux); while ((c = getchar()) != '\n' && c != EOF); while (prox_cad != NULL) { if (prox_cad->ru == ru_aux) { printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); break; } prox_cad = prox_cad->proximo; } break; case 2: printf("\n Digite o nome do Aluno:"); gets_s(nome_aux); while ((c = getchar()) != '\n' && c != EOF); while (prox_cad != NULL) { if (strcmp(prox_cad->nome, nome_aux) == 0) { printf("ru: %d\n nome:%s\n email:%s", prox_cad->ru, prox_cad->nome, prox_cad->email); break; } prox_cad = prox_cad->proximo; } break; default: printf("\n****opcao invalida*****"); break; } } while (1); } void liberarmem() { t_cad *prox_cad; while (ini_cad != NULL) { prox_cad = ini_cad; ini_cad = prox_cad->proximo; free(prox_cad); } }  
    • By 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.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.