Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
ele esta formatado com virgulas, mas eu criei um script usando explode que insere ele para a base de dados so que demora muito.
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
o set_time_limit esta configurado, o problema e que quando roda o script as vezes trava o servidor.
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
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.";
}
?>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 :)
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.
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.";echo "Cadastro realizado com sucesso.";
}
?>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
Um exemplo de como montar a consulta dinamicamente e só executar uma vez:
http://forum.imasters.com.br/index.php?/topic/418448-inserir-varios-registros-em-sequencia/
>
Um exemplo de como montar a consulta dinamicamente e só executar uma vez:
http://forum.imasters.com.br/index.php?/topic/418448-inserir-varios-registros-em-sequencia/
Ok - Deu certo aqui, Grato.
qual é o conteúdo do arquivo? é um arquivo formatado ou possui consultas SQL?