powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в многопоточной программе ПЕРЕвыделять память?
25 сообщений из 101, страница 3 из 5
Как в многопоточной программе ПЕРЕвыделять память?
    #39559549
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovYuRockP.S. Копирование пройдет быстро, если память уже реально выделенаДля realloc есть какой-то другой сценарий?Конечно, если память еще не была использована. А когда выделяют новую память для копирования в нее - вероятность этого вообще велика.

Basil A. SidorovЕсть запросы памяти у системы (делаются большими блоками) и есть работа *alloc в приложенииТак или иначе, "реально" выделять (подыскивать) память система начнет только тогда, когда "в приложении" начнут обращаться к ней. А не в момент "запросов больших блоков у системы".
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559550
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovYuRockА в цикле постоянно если это происходит - надо, значит, "самые быстрые процы" покупвть, чтобы программа работала без тормозов?Можно просто нанять программиста более высокой квалификации. Который сумеет реализовать более адекватный алгоритм.О, я за этот вариант.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559551
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockКонечно, если память еще не была использована. А когда выделяют новую память для копирования в нее - вероятность этого вообще велика.Вы курсы проктостоматологов не заканчивали?
Ещё широко известный в узких кругах dz, лет двадцать тому назад, писал, что не надо стесняться использовать возможности виртуальной памяти: если типово требуется десять мегабайт, но иногда может понадобиться пятьдесят - запрашивайте пятьдесят.Так или иначе, "реально" выделять (подыскивать) память система начнет только тогда, когда "в приложении" начнут обращаться к ней. А не в момент "запросов больших блоков у системы".А вот это сильно зависит от эвристик системного диспетчера виртуальной памяти, доступных ему ресурсов и подсказок, которые могло предоставить приложение.

P.S. Вы из мира сурового хайлоада, постоянно сидящего в свопе или что?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559553
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВы курсы проктостоматологов не заканчивали?
Basil A. SidorovВы из мира сурового хайлоада, постоянно сидящего в свопе или что?
Вы юы лучше разок "запросили у системы" указатель на гигабайт, а свободной памяти у системы, пусть, примерно столько же, и увидели, как мгновенно он "выделится"; и как далеко не мгновенно потом запишется в эту память хотя бы 1 байт.
Чем писать весь этот бред.
И далеко не всегда важно даже, напрямую у системы эту память просить, или через внутренний "в приложении" менеджер.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559555
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockВы юы лучше разок "запросили у системы" указатель на гигабайт, а свободной памяти у системы, пусть, примерно столько же, и увидели, как мгновенно он "выделится"; и как далеко не мгновенно потом запишется в эту память хотя бы 1 байт.
1024*1024*1024/4096 раз по байту
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class test {
  public static void main(String[] args) {
    long start = System.nanoTime();
    final int size = 1024*1024*1024;
    byte[] buffer = new byte[size];
    for (int i = 0; i < size - 1; i += 4096) buffer[i] = (byte) 255;
    System.out.println("Total time: " + (System.nanoTime() - start + 512*1024) / (1024*1024) + " ms.");
  }
}

java -Xms2g test
Код: plaintext
Total time: 395 ms.
Я, конечно, понимаю, что суровым рилтаймерам это смешно, но нас, простых кастомеров - вполне устраивает.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559557
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Не нужен этот цикл был. Достаточно было 1 раз 1 элементу массива что-то присвоить.
Да и при чем тут ява, кстати, не понятно. Ну думаю не важно, кто выделял - машина или нет. В общем, поздравляю, у Вас быстрый компьютер :)
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559560
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockНе нужен этот цикл был.А вы разделите миллисекунды на миллион - станет понятно зачем тут цикл.Да и при чем тут ява, кстати, не понятно.Притом, что "javac test.java&java test" - очень просто и, что немаловажно - очень кросплатформенно
достигая пределов
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class test {
  public static void main(String[] args) {
    int size = 512;
    if (args.length > 0) {
      try { size = Integer.parseInt(args[0]); }
      finally {}
    }
    if (size < 0) size = 512;
    if (size > 1024) size = 512;
    Runtime rt = Runtime.getRuntime();
    System.out.print("Memory: " + (rt.totalMemory() + 512*1024)/1024/1024 + " Mb total / ");
    System.out.println((rt.freeMemory() + 512/1024)/1024/1024 + " Mb free");
    long start = System.nanoTime();
    size *= 1024*1024;
    int[] buffer = new int[size];
    for (int i = 0; i < size - 1; i += 4096) buffer[i] = -1;
    System.out.print("  Time: " + (System.nanoTime() - start + 512*1024) / (1024*1024) + " ms total (");
    System.out.println((size * 4L + 512*1024)/1024/1024 + " Mb buffer)");
    System.out.print("Memory: " + (rt.totalMemory() + 512*1024)/1024/1024 + " Mb total / ");
    System.out.println((rt.freeMemory() + 512/1024)/1024/1024 + " Mb free.");
  }
}

максимум на моей железке
Код: plaintext
1.
2.
3.
java -Xms5000m test 833
Memory: 4792 Mb total / 4741 Mb free
  Time: 1220 ms total (3332 Mb buffer)
Memory: 4792 Mb total / 1409 Mb free.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559561
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovА вы разделите миллисекунды на миллионБыл неправ - винда использует "достаточно энергичный" алгоритм.
Но, в любом случае, ~секунда на "почти миллион страниц" - вполне нормальный результат.
Для желающих лучшего есть более продвинутые методики (*map и большие страницы).
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559606
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov~секунда на "почти миллион страниц"О том и речь. Секунда уходит на 1-е обращение к памяти, на остальнвые 999999 уходит меньше миллисекунды.
Но нам на миллион делить не приходится. У на тут про перевыделение памяти топик. И утверждалось, что правильнее сразу выделять/копировать/освобождать для каждой итерации, тратя на это "секунду", не пытаясь довыделить.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559612
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockИ утверждалось, что правильнее сразу выделять/копировать/освобождать для каждой итерации, тратя на это "секунду", не пытаясь довыделить."Никогда и ничего не доводи до абсурда, ибо человек, желающий трапезовать поздно вечером рискует трапезовать рано по утру" (ц) Козьма Прутков.
Во-первых, не надо работать с "указателями на гигабайт" без специальных методик.
Во-вторых, ваше рассуждение содержит изъян: распределить миллион страниц медленно в первый раз.
повторим на бис ...
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
public class test {
  public static void main(String[] args) {
    int size = 512;
    if (args.length > 0) {
      try { size = Integer.parseInt(args[0]); }
      catch (NumberFormatException e) {}
      finally {}
    }
    if (size < 1) size = 512;
    if (size > 1024) size = 512;
    size *= 1024*1024;

    int[] buffer = new int[0]; buffer = null;

    Runtime rt = Runtime.getRuntime();
    System.out.print("Memory: " + (rt.totalMemory() + 512*1024)/1024/1024 + " Mb total / ");
    System.out.println((rt.freeMemory() + 512/1024)/1024/1024 + " Mb free");

    long start = System.nanoTime();
    buffer = new int[size]; buffer[buffer.length - 1] = -1;
    System.out.print("  Time: " + (System.nanoTime() - start + 512*1024)/1024/1024 + " ms total (");
    System.out.println((4L * buffer.length + 512*1024)/1024/1024 + " Mb buffer)");

    buffer = null; System.gc();

    start = System.nanoTime();
    buffer = new int[size]; buffer[buffer.length - 1] = -1;
    System.out.print("  Time: " + (System.nanoTime() - start + 512*1024)/1024/1024 + " ms total (");
    System.out.println((4L * buffer.length + 512*1024)/1024/1024 + " Mb buffer)");
    System.out.print("Memory: " + (rt.totalMemory() + 512*1024)/1024/1024 + " Mb total / ");
    System.out.println((rt.freeMemory() + 512/1024)/1024/1024 + " Mb free.");
  }
}

... и много раз
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Memory: 4907 Mb total / 4855 Mb free
  Time: 2 ms total (4 Mb buffer)
  Time: 1 ms total (4 Mb buffer)
Memory: 4907 Mb total / 4851 Mb free.
 
Memory: 4907 Mb total / 4855 Mb free
  Time: 6 ms total (16 Mb buffer)
  Time: 2 ms total (16 Mb buffer)
Memory: 4907 Mb total / 4839 Mb free.
 
Memory: 4907 Mb total / 4855 Mb free
  Time: 23 ms total (64 Mb buffer)
  Time: 20 ms total (64 Mb buffer)
Memory: 4907 Mb total / 4791 Mb free.
 
Memory: 4907 Mb total / 4855 Mb free
  Time: 92 ms total (256 Mb buffer)
  Time: 44 ms total (256 Mb buffer)
Memory: 4907 Mb total / 4599 Mb free.
 
Memory: 4907 Mb total / 4855 Mb free
  Time: 369 ms total (1024 Mb buffer)
  Time: 146 ms total (1024 Mb buffer)
Memory: 4907 Mb total / 3832 Mb free.
 
Memory: 4907 Mb total / 4855 Mb free
  Time: 1211 ms total (3332 Mb buffer)
  Time: 451 ms total (3332 Mb buffer)
Memory: 4907 Mb total / 1523 Mb free.
Поэтому повторюсь: если типично требуется мегабайт, но иногда ожидается пять - запрашиваете пять.
И добавлю.
Если "типично-иногда" много - перемножаете ожидаемые "иногда" и "много", запрашиваете буфер суммарного размера и делаете собственное управление памятью, оптимизированное для вашего частного случая.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559639
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovПоэтому повторюсь: если типично требуется мегабайт, но иногда ожидается пять - запрашиваете пять.
Ладно один раз я ему про Фому, он мне про Ярему. Но повторяться...

Последний раз предлагаю подумать. Возьмем vector или динамический массив из других языков, раз тут уж и ява пошла.
Когда создается вектор, естественно, резервируется память под 1000 (условно) указателей. И вот когда они заканчиваются, как Вы считаете (2 вопроса):
1. Правильнее было бы сразу выделить старый размер + еще под 1000 указателей, скопировать и освободить старый массив, либо попытаться довыделить эти 1000*(размер указателя), используя realloc для этого, и только если не получилось - произвести перевыделение:
2. Какой вариант из этих, по вашему, используют для таких задач RTL языков.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559641
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovраспределить миллион страниц медленно в первый разИменно это я и пытался объяснить, указывая, что на миллион нам делить и усреднять не получится, т.к. память для копирования только выделена и именно и будет при копировании этот первый долгий раз.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559650
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockКогда создается вектор, естественно, резервируется память под 1000 (условно) указателей. И вот когда они заканчиваются, как Вы считаете (2 вопроса):
1. Правильнее было бы сразу выделить старый размер + еще под 1000 указателей, скопировать и освободить старый массив, либо попытаться довыделить эти 1000*(размер указателя), используя realloc для этого, и только если не получилось - произвести перевыделение:Я предлагаю немного подумать и сразу создать вектор на десять тысяч элементов. Лишние ~70-150 килобайт никого не задавят. Вас - в том числе.2. Какой вариант из этих, по вашему, используют для таких задач RTL языков.Массивы ява "условно примитивные" (их создаёт JVM) и массивы эти ни разу не динамические - после создания невозможно изменить размер массива.
Вот разновсяческие векторы из библиотеки коллекций - да, динамика. Деталями реализации не интересовался.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559663
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovЯ предлагаю немного подумать и сразу создать вектор на десять тысяч элементовПонятно, все проблемы решаем умножением на 10. Создателям rtl отправь свое предложение подумать, я о их алгоритмах речь вел.
Но какие нафиг алгоритмы, если можно подумать и на 10 умножить. Всё, вопросов больше не имею.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559664
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovМассивы яваПоток мысли. Я не спрашивал, как устроены статические массивы ява. Впрочем, у меня уже давно всё.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559673
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точки - нуллы, плюсики - указатели, звездочки - блоки данных.
Есть вектор:
Код: plaintext
1.
.
.
Мы заполняем вектор данными:
Код: plaintext
1.
+ ***
+ ****
Обнаруживаем, что надо ещё элементов. Создаём бОльший вектор и копируем указатели из старого:
Код: plaintext
1.
2.
3.
. <- + **
. <- + ****
.
.
Задлянафига в этой схеме realloc, если требуется копирование только (маленьких) указателей?
Какой редиска мешал оценить максимальную потребность и сразу создать вектор нужного размера? Кому, кроме суровых микроконтрольщиков нужна такая пессимизация?

P.S. Если вы о чём-то другом, то поясните, кто на ком стоял.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559676
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovОбнаруживаем, что надо ещё элементов. Создаём бОльший вектор и копируем указатели из старого
Это что, серьезно?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559677
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovКакой редиска мешал оценить максимальную потребностьУсловие задачи мешало, в котором написано, что может быть и 0 и 10 и 10млн элементов.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559679
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЭто что, серьезно? "Сдаётся, джентельмены, что это была комедия".
Вы точно не путаете массив переменных и массив указателей на переменные?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559681
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockУсловие задачи мешало, в котором написано, что может быть и 0 и 10 и 10млн элементов.Я повторюсь - создаём массив массивов и реализуем алгоритм, оптимизированный под ваш частный случай.
Ну или берём готовое из boost/stl.
Ни в одном из этих случаев не возникает нужда в realloc.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559686
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovYuRockЭто что, серьезно? "Сдаётся, джентельмены, что это была комедия".
Вы точно не путаете массив переменных и массив указателей на переменные?Да, я говорю про массив указателей переменной длины, который дает возможность добавить элемент без пересоздания на больший.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559688
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovНу или берём готовое из boost/stl.
Ни в одном из этих случаев не возникает нужда в realloc.
Я ж говорю, мне надоело. Заходим в исходники std::vector или TList или не знаю, что там в java, видим там realloc и пишем письмо о том, что его использование нецелесообразно разработчикам - в Microsoft, Oracle, Idera и т.д.
Мне писать уже ничего не надо, мне всё понятно.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559692
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЯ ж говорю, мне надоело. Заходим в исходники std::vector libstdc++ debug/vector подойдёт?
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559701
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovYuRockЯ ж говорю, мне надоело. Заходим в исходники std::vector libstdc++ debug/vector подойдёт?Да, нажми ctrl+f в открывшемся по своей ссылке, набери в строке поиска realloc и начинай писать письмо разработчикам.
...
Рейтинг: 0 / 0
Как в многопоточной программе ПЕРЕвыделять память?
    #39559718
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockДа, нажми ctrl+f в открывшемся по своей ссылке, набери в строке поиска reallocВы точно смотрели, что делают все эти realloc-и?
Подсказка: наберите в строке поиска "alloc("
...
Рейтинг: 0 / 0
25 сообщений из 101, страница 3 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как в многопоточной программе ПЕРЕвыделять память?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]