Недостаточно памяти на PHP-ML

Я пытаюсь реализовать анализ настроений с помощью PHP-ML. У меня есть набор данных обучения примерно 15000 записей. У меня есть работающий код, однако я должен уменьшить набор данных до 100 записей, чтобы он работал. Когда я пытаюсь запустить полный набор данных, я получаю эту ошибку:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 917504 bytes) in C:\Users\<username>\Documents\Github\phpml\vendor\php-ai\php-ml\src\Phpml\FeatureExtraction\TokenCountVectorizer.php on line 95

У меня есть два файла index.php:

<?php

declare(strict_types=1);
namespace PhpmlExercise;

include 'vendor/autoload.php';

include 'SentimentAnalysis.php';

use PhpmlExercise\Classification\SentimentAnalysis;
use Phpml\Dataset\CsvDataset;
use Phpml\Dataset\ArrayDataset;
use Phpml\FeatureExtraction\TokenCountVectorizer;
use Phpml\Tokenization\WordTokenizer;
use Phpml\CrossValidation\StratifiedRandomSplit;
use Phpml\FeatureExtraction\TfIdfTransformer;
use Phpml\Metric\Accuracy;
use Phpml\Classification\SVC;
use Phpml\SupportVectorMachine\Kernel;

$dataset = new CsvDataset('clean_tweets2.csv', 1, true);
$vectorizer = new TokenCountVectorizer(new WordTokenizer());
$tfIdfTransformer = new TfIdfTransformer();
$samples = [];
foreach ($dataset->getSamples() as $sample) {
$samples[] = $sample[0];
}
$vectorizer->fit($samples);
$vectorizer->transform($samples);
$tfIdfTransformer->fit($samples);
$tfIdfTransformer->transform($samples);
$dataset = new ArrayDataset($samples, $dataset->getTargets());
$randomSplit = new StratifiedRandomSplit($dataset, 0.1);

$trainingSamples = $randomSplit->getTrainSamples();
$trainingLabels     = $randomSplit->getTrainLabels();

$testSamples = $randomSplit->getTestSamples();
$testLabels      = $randomSplit->getTestLabels();

$classifier = new SentimentAnalysis();
$classifier->train($randomSplit->getTrainSamples(), $randomSplit->getTrainLabels());
$predictedLabels = $classifier->predict($randomSplit->getTestSamples());

echo 'Accuracy: '.Accuracy::score($randomSplit->getTestLabels(), $predictedLabels);

И SentimentAnalysis.php:

<?php

namespace PhpmlExercise\Classification;
use Phpml\Classification\NaiveBayes;

class SentimentAnalysis
{
protected $classifier;

public function __construct()
{
$this->classifier = new NaiveBayes();
}
public function train($samples, $labels)
{
$this->classifier->train($samples, $labels);
}

public function predict($samples)
{
return $this->classifier->predict($samples);
}
}

Я довольно новичок в машинном обучении и php-ml, поэтому я не совсем уверен, как определить, где проблема, или есть ли способ исправить это, не имея тонны памяти. Самое большее, что я могу сказать, это то, что ошибка происходит в TokenCountVectorizer в строке 22 индексного файла. Кто-нибудь имеет какие-либо идеи, что может быть причиной этой проблемы?

Ссылка на PHP-ML находится здесь: http://php-ml.readthedocs.io/en/latest/

Спасибо

1

Решение

Эта ошибка возникает из-за того, что в память загружается больше, чем то, что PHP настроил для обработки в одном процессе. Есть и другие причины, но они встречаются гораздо реже.

В вашем случае ваш экземпляр PHP, кажется, настроен на максимальное 128MB памяти, которая будет использоваться. В машинном обучении это не очень много, и если вы используете большие наборы данных, вы наверняка достигнете этого предела.

Чтобы изменить объем памяти, которую вы разрешаете использовать PHP 1GB Вы можете редактировать свой php.ini файл и набор

memory_limit = 1024M

Если у вас нет доступа к файлу php.ini, но у вас все еще есть права на изменение настроек, вы можете сделать это во время выполнения, используя

<?php
ini_set('memory_limit', '1024M');

В качестве альтернативы, если вы запускаете апаш Вы можете попытаться установить предел памяти, используя .htaccess файловая директива

php_value memory_limit 1024M

Обратите внимание, что большинство решений общего хостинга и т. Д. Имеют жесткое и зачастую низкое ограничение на объем памяти, который вам разрешено использовать.

Другие вещи, которые вы можете сделать, чтобы помочь

  • Если вы загружаете данные из файлов, посмотрите на fgets а также SplFileObject::fgets загружать прочитанные файлы построчно вместо чтения всего файла в память сразу.
  • Убедитесь, что вы используете как можно более свежую версию PHP
  • Убедитесь, что расширения PHP актуальны
  • Отключите расширения PHP, которые вы не используете
  • unset данные или большие объекты, с которыми вы закончили и больше не нуждаетесь в памяти. Обратите внимание, что сборщик мусора в PHP не обязательно сразу освобождает память. Вместо этого, по замыслу, он будет делать это, когда почувствует, что требуемые циклы ЦП существуют или до того, как сценарию не хватит памяти, что бы ни произошло первым.
  • Вы можете использовать что-то вроде echo memory_get_usage() / 1024.0 . ' kb' . PHP_EOL; распечатать использование памяти в заданном месте в вашей программе, чтобы попытаться определить, сколько памяти используют разные части.
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]