Генерируйте отчетливо другой RGB, раскрашивает графики

Неустранимая ошибка: допустимый размер памяти из XXX байт исчерпан (пытался выделить XXX байты)

Недостаточно памяти для запуска вашего скрипта. PHP достиг предела памяти и перестает его выполнять. Эта ошибка является фатальной, сценарий останавливается. Значение предела памяти можно настроить либо в файле php.ini, либо с помощью ini_set('memory_limit', '128 M'); в скрипте (который перезапишет значение, определенное в php.ini). Цель ограничения памяти заключается в том, чтобы не допустить, чтобы один скрипт PHP собирал всю доступную память и приводил к остановке всего веб-сервера.

Первое, что нужно сделать, это свести к минимуму объем памяти, необходимый вашему сценарию , Например, если вы читаете большой файл в переменной или извлекаете много записей из базы данных и сохраняете их все в массиве, которые могут использовать много памяти. Измените свой код, чтобы вместо этого читать строки по строке или извлекать записи базы данных по одному, не сохраняя их все в памяти. Это требует немного концептуального понимания того, что происходит за кулисами, и когда данные хранятся в памяти и в других местах.

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

Вопросы, относящиеся:

78
задан Peter O. 27 August 2017 в 16:53
поделиться

4 ответа

У Вас есть три цветовых канала от 0 до 255 R, G и B.

Первый проходят

0, 0, 255
0, 255, 0
255, 0, 0

, Тогда проходят

0, 255, 255
255, 0, 255
255, 255, 0

, Тогда делятся на 2 => 128 и запускаются снова:

0, 0, 128
0, 128, 0
128, 0, 0
0, 128, 128
128, 0, 128
128, 128, 0

Делятся на 2 => 64

, Следующий раз добавляет 64 - 128 => 192

, следуют за шаблоном.

Простой к программе и дает Вам довольно разные цвета.

РЕДАКТИРОВАНИЕ: Запрос на пример кода

Также - добавляющий в дополнительном шаблоне как ниже, если серый является приемлемым цветом:

255, 255, 255
128, 128, 128 

существует много способов, которыми можно обработать генерацию их в коде.

Простой способ

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

    static string[] ColourValues = new string[] { 
        "FF0000", "00FF00", "0000FF", "FFFF00", "FF00FF", "00FFFF", "000000", 
        "800000", "008000", "000080", "808000", "800080", "008080", "808080", 
        "C00000", "00C000", "0000C0", "C0C000", "C000C0", "00C0C0", "C0C0C0", 
        "400000", "004000", "000040", "404000", "400040", "004040", "404040", 
        "200000", "002000", "000020", "202000", "200020", "002020", "202020", 
        "600000", "006000", "000060", "606000", "600060", "006060", "606060", 
        "A00000", "00A000", "0000A0", "A0A000", "A000A0", "00A0A0", "A0A0A0", 
        "E00000", "00E000", "0000E0", "E0E000", "E000E0", "00E0E0", "E0E0E0", 
    };

Твердый Путь

, Если Вы не знаете, в каком количестве цветов Вы собираетесь нуждаться, код ниже генерирует до 896 цветов с помощью этого шаблона. (896 = 256 * 7 / 2), 256 цветовое пространство на канал, у нас есть 7 шаблонов, и мы останавливаемся, прежде чем мы доберемся до цветов, разделенных только 1 значением цвета.

я, вероятно, сделал более трудную работу этого кода, чем я должен был. Во-первых, существует генератор интенсивности, который запускается в 255, затем генерирует значения согласно шаблону, описанному выше. Генератор шаблона просто циклы через эти семь цветовых шаблонов.

using System;

class Program {
    static void Main(string[] args) {
        ColourGenerator generator = new ColourGenerator();
        for (int i = 0; i < 896; i++) {
            Console.WriteLine(string.Format("{0}: {1}", i, generator.NextColour()));
        }
    }
}

public class ColourGenerator {

    private int index = 0;
    private IntensityGenerator intensityGenerator = new IntensityGenerator();

    public string NextColour() {
        string colour = string.Format(PatternGenerator.NextPattern(index),
            intensityGenerator.NextIntensity(index));
        index++;
        return colour;
    }
}

public class PatternGenerator {
    public static string NextPattern(int index) {
        switch (index % 7) {
        case 0: return "{0}0000";
        case 1: return "00{0}00";
        case 2: return "0000{0}";
        case 3: return "{0}{0}00";
        case 4: return "{0}00{0}";
        case 5: return "00{0}{0}";
        case 6: return "{0}{0}{0}";
        default: throw new Exception("Math error");
        }
    }
}

public class IntensityGenerator {
    private IntensityValueWalker walker;
    private int current;

    public string NextIntensity(int index) {
        if (index == 0) {
            current = 255;
        }
        else if (index % 7 == 0) {
            if (walker == null) {
                walker = new IntensityValueWalker();
            }
            else {
                walker.MoveNext();
            }
            current = walker.Current.Value;
        }
        string currentText = current.ToString("X");
        if (currentText.Length == 1) currentText = "0" + currentText;
        return currentText;
    }
}

public class IntensityValue {

    private IntensityValue mChildA;
    private IntensityValue mChildB;

    public IntensityValue(IntensityValue parent, int value, int level) {
        if (level > 7) throw new Exception("There are no more colours left");
        Value = value;
        Parent = parent;
        Level = level;
    }

    public int Level { get; set; }
    public int Value { get; set; }
    public IntensityValue Parent { get; set; }

    public IntensityValue ChildA {
        get {
            return mChildA ?? (mChildA = new IntensityValue(this, this.Value - (1<<(7-Level)), Level+1));
        }
    }

    public IntensityValue ChildB {
        get {
            return mChildB ?? (mChildB = new IntensityValue(this, Value + (1<<(7-Level)), Level+1));
        }
    }
}

public class IntensityValueWalker {

    public IntensityValueWalker() {
        Current = new IntensityValue(null, 1<<7, 1);
    }

    public IntensityValue Current { get; set; }

    public void MoveNext() {
        if (Current.Parent == null) {
            Current = Current.ChildA;
        }
        else if (Current.Parent.ChildA == Current) {
            Current = Current.Parent.ChildB;
        }
        else {
            int levelsUp = 1;
            Current = Current.Parent;
            while (Current.Parent != null && Current == Current.Parent.ChildB) {
                Current = Current.Parent;
                levelsUp++;
            }
            if (Current.Parent != null) {
                Current = Current.Parent.ChildB;
            }
            else {
                levelsUp++;
            }
            for (int i = 0; i < levelsUp; i++) {
                Current = Current.ChildA;
            }

        }
    }
}
130
ответ дан Sam Meldrum 24 November 2019 в 10:26
поделиться

Я думаю HSV (или HSL), пространство имеет больше возможностей здесь. Если Вы не возражаете против дополнительного преобразования, довольно легко пройти все цвета, просто повернув значение Оттенка. Если это недостаточно, можно изменить значения Насыщенности/Значения/Легкости и пройти вращение снова. Или, можно всегда смещать значения Оттенка или изменять "ступающий" угол и вращаться больше раз.

8
ответ дан aib 24 November 2019 в 10:26
поделиться

Я запустил бы с яркости набора 100% и обошел бы основные цвета сначала:

FF0000, 00FF00, 0000FF

тогда комбинации

FFFF00, FF00FF, 00FFFF

затем, например, делят на два яркость и делают тот же раунд. Нет слишком многих явно действительно разных цветов, после них я начал бы варьироваться ширина строки и делать точечные / пунктирные линии и т.д.

1
ответ дан mmiika 24 November 2019 в 10:26
поделиться

Вы могли получить случайный набор своих 3 255 значений и проверить его по последнему набору 3 значений, удостоверившись, что они - каждый по крайней мере X далеко от старых значений перед использованием их.

СТАРЫЙ: 190, 120, 100

НОВЫЙ: 180, 200, 30

, Если бы X = 20, то новый набор был бы повторно создан снова.

-3
ответ дан Totty 24 November 2019 в 10:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: