Pull to refresh
13
0
Александр Зеленин @aleksandr-s-zelenin

Характер — нордический, стойкий.

Send message

Купил. В книге 272 страницы. Прочитал 102, больше не могу. Одна вода, не рекомендую.

Решардирование - это как? Вы просто добавляете новый шард и новые данные пишутся туда? Или нужно перетрясти все шарды переместив 1/N часть данных каждого на новый? Судя по тексту вы используете первый вариант, но термин "решардирование" смутил.

Хм, респект. Прям здорово у вас получается. Спасибо за статью )

Отличная статья, спасибо!

P. S. Хабр со временем растерял часть изображений, вот тут есть копия статьи, но с картинками: https://www.pvsm.ru/dokumentatsiya/290673

А кто-нибудь знает, где полная версию интервью? Что они только обрезок у интервью у себя на канале выложили..?

Как можно плюсануть статью? Сейчас +26 вижу, но что нажать не вижу...

Хм, отличная статья, спасибо. Для того, чтобы "одноразовые" контейнеры не копились, нужно использовать флаг --rm, не знаю был ли он у команды run в 2017-ом )

Честно говоря я об этом не подумал, сосредоточился на другом. В любом случае нужно делать замеры и смотреть что да как.

Замерял с помощью quantify скорость работы программы, которая буферизировано копирует большой файл размером 500 мб в другой файл.

Что есть quantify?

Да, глядя на эти схемы невольно начинаешь проникаться тем, о чём говорит Дуглас Крокфорд.

У меня вот такой PHP:

PHP 8.2.3 (cli) (built: Feb 15 2023 00:30:25) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.3, Copyright (c) Zend Technologies
    with Xdebug v3.2.1, Copyright (c) 2002-2023, by Derick Rethans
    with Zend OPcache v8.2.3, Copyright (c), by Zend Technologies

И вот такой вывод:

memory: 2648
memory: 2680
memory: 2712, i: 0
memory: 2712
memory: 2712

Т.е. PHP сразу в 3 раза меньше памяти потребляет, интересно. Покажите ваш php -v. Если уберёте break из вашего кода, то увидите рост.

Я прошу прощения, я вас с @FanatPHPперепутал. А ожидается как минимум мной потому что в документации сказано, что by default, variables are always assigned by value. А тонкие материи там освещены так себе. Поэтому и ожидается... дефолтное поведение.

Я устал с вами с спорить. Вы не ответили на вопрос как объяснить то, что при передаче массива в функцию и по ссылке и по значению кол-во потребляемой памяти не увеличивается. Потому что ответ очевиден, но вы не хотите признать эту очевидность, потому что всегда считали, что массив передаётся по значению. И ввиду нежелания принять этот факт решили свести всё к терминологическому спору. Моя статья не про точность терминов, а про то, как работать с массивами не вызывая чрезмерного потребления памяти. И эти чёртовы массивы в PHP передаются по ссылке, указателю или ещё какому-то фантомному референсу не вызывая копирования, как это ожидается, при передаче по значению. Потому что они передаются не по значению.

Вот ваше расписание на неделю:

Отличный анекдот, кстати )

Только это не объясняет почему в обоих случаях потребление памяти осталось одинаковым. Ведь очевидно, что копия сделана не была.

Copy-on-write - это не третий и никакой вообще способ передачи. Это механизм позволяющий оттянуть или вовсе избежать копирования параметров функции. Он опционален. И без COW можно реализовать передачу по ссылке и по значению.

Что касается терминологии, то возможно, следовало упомянуть в статье, что имеется ввиду по ссылкой (я подправлю потом текст). В «Reference Counting Basics» сказано:

Since PHP allows user-land references, as created by the & operator, a zval container also has an internal reference counting mechanism to optimize memory usage.

Я имею ввиду именно те самые внутренние ссылки - internal reference - которые можно явно задать при помощи амперсанда или те, которые PHP создаст сам, где посчитает нужным. В данном случае он создаёт внутреннюю ссылку (не внутрь куда-то, а другую, не user-land) на массив при передаче его в функцию по значению.

Баста! Я придумал как доказать это:

<?php

function passByReference(&$array, int $baseMemory) {

  printf('memory in %s: %s%s', __FUNCTION__, memory_get_usage() - $baseMemory, PHP_EOL);
}

function passByValue($array, int $baseMemory) {

  printf('memory in %s: %s%s', __FUNCTION__, memory_get_usage() - $baseMemory, PHP_EOL);
}

$baseMemory = memory_get_usage();
$array = range(0, 99);

printf('base memory: %s%s', memory_get_usage() - $baseMemory, PHP_EOL);
passByReference($array, $baseMemory);
printf('memory between: %s%s', memory_get_usage() - $baseMemory, PHP_EOL);
passByValue($array, $baseMemory);
printf('memory after: %s%s', memory_get_usage() - $baseMemory, PHP_EOL);

Вывод:

base memory: 2616
memory in passByReference: 2680
memory between: 2680
memory in passByValue: 2680
memory after: 2680
  1. Разницу в 2680 - 2616 = 64 опустим как несущественную.

  2. Внутри passByReference как видно объём не увеличился вдвое. Почему? Потому что массив передаётся по ссылке.

  3. Внутри passByValue как видно объём не увеличился вдвое. Почему? По той же самой причине: массив передаётся по ссылке.

@FanatPHP, как вы объясните наблюдаемые данные?

Данное утверждение является на 100% неверным. Массивы не передаются по ссылке. Вы называете передачей по ссылке передачу по значению с использованием copy-on-write. То есть, путаете эти два механизма.

Действительно, в документации, кажется, нигде явно не написано, что массивы передаются по ссылке. На stackoverflow.com есть разбор этого вопроса: Are arrays in PHP copied as value or as reference to new variables, and when passed to functions? И там говорится, что по ссылке. Там же есть ссылка на другой документ (один я уже приводил: «Reference-counting and copy-on-write»): PHP internals: When does foreach copy? И там есть вот такие строки (вырвано из контекста, нужно ознакомиться с разделом целиком):

The reason is that the array zval is now shared between multiple variables: The $array variable outside the function and the $array variable inside it.

Т.е. подразумевается, что массив передался по ссылке и теперь две переменные указывают на один и тот же zval.

Я склонен считать, что массивы в PHP передаются по ссылке всегда.

Да, есть такое. Массивы в PHP хранят свой размер, а не вычисляют его при каждом вызове.

1

Information

Rating
Does not participate
Date of birth
Registered
Activity

Specialization

Fullstack Developer