Ir para conteúdo

POWERED BY:

Arquivado

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

yurickvinicius

[Resolvido] Inserir arquivo.txt de 350 MG na base de dados

Recommended Posts

Estou precisando de ajuda para inserir um arqui.txt de 350 MG na base de dados, estou usando o comando fopen("arquivo.txt", "r"); para abrir o arquivo e fgets($ponteiro, 4096); para ler as linhas, so que o arquivo e muito grande, alguem conhese um metodo mais rapido para fazer isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

demora mesmo. é muita coisa

se estiver ultrapassando o tempo máximo de execução, use set_time_limit(0) para desabilitar esse limite

 

Outra possibilidade é gerar um arquivo com os comandos SQL e carregá-los diretamente pelo MySQL, mas creio que demorará mais, já que tem que reescrever o arquivo e ainda carregá-lo no MySQL

Compartilhar este post


Link para o post
Compartilhar em outros sites

não está ultrapassando o limite de memória?

como funciona seu script? ele joga tudo na memória depois salva no banco? o ideal é salvar pequenos blocos de dados de cada vez, liberando a memória usada

Compartilhar este post


Link para o post
Compartilhar em outros sites

O limite da memoria esta configurado. o script e o seguinte.

 

<?php

include "condb.php";

 

$ponteiro = fopen ("PORTA.txt", "r");

while (!feof ($ponteiro)) {

 

$linha = fgets($ponteiro, 4096);

 

$eot = explode ( "," , $linha);

$vet_n_port[] = $eot[0];

 

$eot = explode ( "," , $linha);

$vet_eot[] = $eot[2];

 

}

 

for($a=0; $a<count($vet_n_port); $a++){

if($vet_n_port[$a] !=="0"){

$vet[] = $vet_n_port[$a];

}

}

 

for($i=0; $i < count($vet_n_port); $i++){

echo $i;

$insdb = mysql_query("Insert Into porta (n_portado, eot) values('".$vet_n_port[$i]."','".$vet_eot[$i]."')");

}

 

if(!$insdb){

echo "Nao foi possivel cadastrar os dados.";

}else{

echo "Dados cadastrados com sucesso.";

}

 

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

você faz dois explode's idênticos. não precisa disso.

 

você está copiando tudo para a memória. pode estar ultrapassando o limite permitido para sue usuário

Além disso, você está executando uma consulta para cada iteração. Isso faz demorar MUITO mais

 

Sugiro que monte apenas uma SQL com todos os dados. Assim:

 

INSERT INTO tabela (campos) VALUES (valor1), (valor2), (valor3)...

 

no final você executa apenas uma consulta que insere todos os dados.

 

 

para melhorar ainda mais, use menos memória: leia X linhas, insira os dados na string com a SQL e libere a memória (função unset). Depois leia mais X linahs e salve os dados. E assim por diante

 

 

dá par quebrar um pouco a cabeça com o script, mas não é difícil :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Além do que o Beraldo já disse, você pode (e deve) otimizar seu código:

 

1. Se os dados estão separados por vírgula, trata-se de CSV, nesse caso utilize fgetcsv()

2. Faça uma paginação e trabalhe paralelamente utilizando a PCNTL (em modo CGI)

3. Utilize o design pattern Command para executar as operações.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok eu mudei um pouco o script, deu pouca diferença, se puderem me dar um exemplo de escrip, eu fico grato, nao consegui descobri ou fazer de outra maneira + eficaz :/, deixei assim agora

 

<?php
include "condb.php";

$ponteiro = fopen ("arquivo.txt", "r");

function destroy_vet ()
{
global $vet_n_port ;
global $vet_eot ;
unset( $vet_n_port, $vet_eot );
}

while (!feof($ponteiro)) {

$linha = fgets($ponteiro, 4029);
$eot = explode ( "," , $linha);
$vet_n_port[] = $eot[0];
$vet_eot[] = $eot[2];
}
destroy_vet ();

for($i=0; $i < count($vet_n_port); $i++){
$query = mysql_query("Insert Into porta (n_portado, eot) values ('$vet_n_port[$i]','$vet_eot[$i]')");
}
if(!$query){
echo "Nao foi possivel cadastrar.";
}else{
echo "Cadastro realizado com sucesso.";
}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

se puderem me dar um exemplo de escrip

 

Não é esse o objetivo do fórum, amigo.

 

Porém, se você precisar de suporte particular, poste uma Oferta para Freelancers ou consulte o Mercado iMasters

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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