Seu interpretador PHP está definido para finalizar qualquer script que requer mais de 132MB de memória. Seu script está tentando alocar mais de 161 MB de memória. O problema é bem simples e as soluções também. Você pode:
- Obtenha seu interpretador PHP para alocar mais. A razão pela qual seu host está desaconselhando é que, se ele não o fizer, ele acabará alocando 8 GB + de memória para você simplesmente porque seu banco de dados continua crescendo.
- Esqueça o PHP e a API
mysql_*
obsoleta e use algo que não impõe restrições de memória. Lembre-se de que, mesmo que o intérprete não o incomode mais, o SO provavelmente irá em algum momento. - Melhore seu script.
Usar mysql_unbuffered_query
é a solução 3. Como o PHP não armazena mais o conjunto de resultados do MySQL, ele não ocupa tanta memória e o intérprete para de reclamar. Você está basicamente trocando de consultas bufferizadas para sem buffer (veja os exemplos # 2 e # 3, e considere a mudança para o PDO, isso é 2016 ). Se você quiser continuar trabalhando com o PHP e se achar que seu design está correto, esta é a sua solução.
I don't want to change the code since I want the server to read the results to RAM wherever possible.
As pessoas que trabalham em DBMSes geralmente estão fazendo um ótimo trabalho. Seus mecanismos são otimizados e uma consulta não leva mais tempo do que o necessário. Considerando o fato de que você está usando PHP e a antiga mysql_*
API, você não quer que eu acredite que a velocidade é realmente uma preocupação aqui ... Meu palpite é: você pode ter recursos para manter os dados no banco de dados, e não na RAM. Use consultas sem buffer, busque / processe suas linhas uma de cada vez e confie em seu DBMS um pouco mais (além disso, ele provavelmente fará algum buffering para você ...).
Se você ainda não está convencido, uma possível melhora poderia ser repensar as próprias perguntas. Tem certeza de que não está buscando mais dados do que o necessário? (quero dizer, você realmente precisa do SELECT *
no início da sua consulta?) Tem certeza de que o MySQL não poderia cuidar de algum processamento para você? DBMSes são ferramentas bastante poderosas, colocá-los para funcionar e não fazem tudo em seu script PHP. Um exemplo típico seria computar uma média: em vez de buscar todos os números na coluna e usar um loop de soma, peça AVG(column)
diretamente.
Sem o seu script, é muito difícil dar mais conselhos sobre essa parte (e o pessoal do Stack Overflow provavelmente faria um trabalho melhor). No entanto, se você achar que já trouxe modificações suficientes para o seu script ... que tal submetê-lo à revisão de código ? Se você não consegue ver uma maneira de melhorá-lo ainda mais, é provável que as pessoas lá estejam.
Se, em algum momento, você sentir que já esgotou todas as opções que o PHP e o MySQL tinham a oferecer, acho que você terá que considerar usar outra coisa. Dependendo do tipo de processamento de dados que você está fazendo, você pode encontrar outras ferramentas mais adequadas à tarefa em questão.