В качестве точки данных я попробовал следующий скрипт в OS X 10.10.5, используя встроенную утилиту Macina Pro Retina с процессором Intel Core i7 с тактовой частотой 2,8 ГГц:
#!/bin/bash
humombo="X"
while true; do
humombo="$humombo$humombo"
echo "Time $(date "+%H:%M:%S"), chars $(echo "$humombo" | wc -c)"
done
Результаты:размер счастливо удваивается снова и снова (обратите внимание, что размеры включают дополнительный байт для конца одной строки).Вещи начали замедляться, когда humombo
прошел 4MB;удвоение с 256 МБ до 512 МБ заняло 48 секунд, и сценарий взорвался после этого:
mbpe:~ griscom$ ./delme.sh
Time 16:00:04, chars 3
Time 16:00:04, chars 5
Time 16:00:04, chars 9
Time 16:00:04, chars 17
Time 16:00:04, chars 33
Time 16:00:04, chars 65
Time 16:00:04, chars 129
Time 16:00:04, chars 257
Time 16:00:04, chars 513
Time 16:00:04, chars 1025
Time 16:00:04, chars 2049
Time 16:00:04, chars 4097
Time 16:00:04, chars 8193
Time 16:00:04, chars 16385
Time 16:00:04, chars 32769
Time 16:00:04, chars 65537
Time 16:00:04, chars 131073
Time 16:00:04, chars 262145
Time 16:00:04, chars 524289
Time 16:00:04, chars 1048577
Time 16:00:04, chars 2097153
Time 16:00:05, chars 4194305
Time 16:00:05, chars 8388609
Time 16:00:07, chars 16777217
Time 16:00:09, chars 33554433
Time 16:00:15, chars 67108865
Time 16:00:27, chars 134217729
Time 16:00:51, chars 268435457
Time 16:01:39, chars 536870913
bash(80722,0x7fff77bff300) malloc: *** mach_vm_map(size=18446744071562072064) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
./delme.sh: xrealloc: cannot allocate 18446744071562068096 bytes
mbpe:~ griscom$
Два примечания:
Я подозреваю, что падение было больше, чем целоепроцесс занял слишком много памяти, вместо того, чтобы достичь предела емкости одной переменной.
Играя с этим, я выполнял те же команды в интерактивном режиме, и когда выход из цикла завершился, bash был прерван.;Я должен был открыть новое окно терминала, чтобы сделать что-нибудь.Таким образом, слишком большое выделение памяти нарушает работу bash неизвестными способами;Я предполагаю, что выполнение этого внутри скрипта очищает при выходе.
Редактировать : Я только что попробовал тот же код в мощной системе Ubuntu 18:
Time 18:03:02, chars 3
Time 18:03:02, chars 5
Time 18:03:02, chars 9
Time 18:03:02, chars 17
Time 18:03:02, chars 33
Time 18:03:02, chars 65
Time 18:03:02, chars 129
Time 18:03:02, chars 257
Time 18:03:02, chars 513
Time 18:03:02, chars 1025
Time 18:03:02, chars 2049
Time 18:03:02, chars 4097
Time 18:03:02, chars 8193
Time 18:03:02, chars 16385
Time 18:03:02, chars 32769
Time 18:03:02, chars 65537
Time 18:03:02, chars 131073
Time 18:03:02, chars 262145
Time 18:03:02, chars 524289
Time 18:03:02, chars 1048577
Time 18:03:02, chars 2097153
Time 18:03:02, chars 4194305
Time 18:03:02, chars 8388609
Time 18:03:03, chars 16777217
Time 18:03:04, chars 33554433
Time 18:03:07, chars 67108865
Time 18:03:12, chars 134217729
Time 18:03:23, chars 268435457
Time 18:03:43, chars 536870913
./delme.sh: xrealloc: cannot allocate 18446744071562068096 bytes
Это заняло меньше половины времени и умерло немного чище, но с тем же размером символов.(Кстати, число в сообщении об ошибке, десятичное 18446744071562068096, равно 0xffff ffff 8000 0080, поэтому очевидно, что здесь мы достигаем некоторых ограничений по количеству.)