powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / рекурсивная функция делает переполнение кучи.
25 сообщений из 132, страница 3 из 6
рекурсивная функция делает переполнение кучи.
    #39365007
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

отваливается всё равно по ошибке IOConsole Updater "An internal error has occurred.
Java heap space" даже прикрутив логатер . Вопрос: можно ли чтобы он сохранял лог в файл , а не на выводил на экран ?
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365033
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81, чувак я-же тебе писал. Подключи нормальные библиотеки логгирования. Настрой appenders.
Настрой их на запись в текстовые файлы. Вот тебе ссылки.

https://logging.apache.org/log4j/2.x/manual/appenders.html
http://logback.qos.ch/manual/appenders.html

А текстовое окошко внизу которое тебе ЛЮБЕЗНО предоставляет среда разработки
перепоелняет heap и правильно делает ибо нефиг слать терабайты текста в
ИНФОРМАЦИОННОЕ (!) на минуточку окошко.

Да вообще ничего писать не надо! Напиши только резалт когда функция закончит работу.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365041
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Да вообще ничего писать не надо! Напиши только резалт когда функция закончит работу.

закончит , но не скоро )
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365084
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня на С++ в 2003 году на Celeron-300 эта задача решалась за минут пять.

А щас учитывая рост перформанса можно просто умножать на десять. Тоесть
за полминуты должна решаться.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365093
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ меня на С++ в 2003 году на Celeron-300 эта задача решалась за минут пять.

А щас учитывая рост перформанса можно просто умножать на десять. Тоесть
за полминуты должна решаться.

вы когда о процессах говорили вы многопоточность имели ввиду ?
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365095
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я говорил о способности этой задачи исполнятся параллельно. А будь это процесссы (ProcessBuilder)
или потоки (Thread) - это уже детали реализации.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365096
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

хорошо, тогда я не вижу иного способа как иметь n разных массивов и работать с ними параллельно. а ещё вести один глобальный массив куда складывались бы тупиковые маршруты . таким образом мы исключим повторений по тупиковым путям в разных потоках
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365118
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем вам нужен глобальный массив?
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365128
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗачем вам нужен глобальный массив?

глобальный , ну я честно говоря уже запамятовал как потоками пользоваться, я сказал так в предположении , что каждый поток это отдельный класс. мне видимо надо эту тему освежить.
не пинайте сильно :)
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365129
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ меня на С++ в 2003 году на Celeron-300 эта задача решалась за минут пять.


для стартовой точки 1:1 выдает менее чем за минуту кучу решений .
а вот для других уходит в думы
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365149
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81maytonЗачем вам нужен глобальный массив?

глобальный , ну я честно говоря уже запамятовал как потоками пользоваться, я сказал так в предположении , что каждый поток это отдельный класс. мне видимо надо эту тему освежить.
не пинайте сильно :)
Давай порассуждаем. У тебя - идеальная задача. Она идеально параллелится.
Можно в 4 Thread запустить разные экземпляры расчетов только задав им разные
условия чтобы пути коней не пересекались. Это нужно для повышения КПД а вовсе
не для решения коллизий. Задейстовать либо Random с разными seed либо hash-функции.

Или если рассматривать проблему коня как поиск маршрутов в дереве
то нам достаточно описать простой алгоритм расщепления дерева на 4
поддерева.

Включать в эту модель какой-то глобальный массив нет смысла. Во первых
это замедлит прозводительность. 4 потока будут конкурентно писать туда.

Во вторых единой точкой соприкосновения этих потоков реально будет только
публикация отчота. Или финал работы.

Число 4 я взял просто для примера. Пока - необоснованно. Но можно брать и другие
числа.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365152
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanrauid unique,
вот допустим, на 64 ходу найдено решение. Вопрос: выйдет ли код из цикла?
Код: java
1.
while (!(!success || mc == 9))



там достаточно
Код: java
1.
while (success)


было потому что когда мс 9, то success = false.
пардон, в алгоритм не вникал.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365184
uid unique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonandron81, чувак я-же тебе писал. Подключи нормальные библиотеки логгирования. Настрой appenders.
Настрой их на запись в текстовые файлы. Вот тебе ссылки.

https://logging.apache.org/log4j/2.x/manual/appenders.html
http://logback.qos.ch/manual/appenders.html

А текстовое окошко внизу которое тебе ЛЮБЕЗНО предоставляет среда разработки
перепоелняет heap и правильно делает ибо нефиг слать терабайты текста в
ИНФОРМАЦИОННОЕ (!) на минуточку окошко.

Да вообще ничего писать не надо! Напиши только резалт когда функция закончит работу.

Положите вот такой файлиk logback.xml в папку с библиотеками или в корень класс файлов
Код: xml
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.
34.
35.
36.
37.
38.
39.
40.
<?xml version="1.0" encoding="UTF-8"?>

<configuration>
  
  <!--Console logger -->
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>
  </appender>
 <!-- DEBUG log -->
  <appender name="DEBUG_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/test.debug.log</file>
	<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
		<!-- daily rollover -->
		<fileNamePattern>logs/test.debug.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
		<timeBasedFileNamingAndTriggeringPolicy	class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
			<!-- or whenever the file size reaches 32MB -->
			<maxFileSize>32MB</maxFileSize>
		</timeBasedFileNamingAndTriggeringPolicy>
		<!-- N days' worth of history -->
		<maxHistory>3</maxHistory>
	</rollingPolicy>
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
  
  <appender name="DEBUG_LOG" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="DEBUG_LOG_FILE" />
  </appender> 

  <root level="INFO">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="DEBUG_LOG"/>
  </root>
</configuration>



main метод запускайте установив переменную Java Xmx (максимальный размер памяти)
java -Xmx1024m ru.sql.forum.samples.Horse (поправьте имя класса)

Скачайте и добавьте в путь logback-classic-<VERSION>.jar и slf4j-api-<VERSION подходящая к версии logback>.jar
Библиотеки и инструкции/примеры здесь:
http://logback.qos.ch/download.html

По уменьшению расхода памяти можно предложить если вам достаточно бинарного массива (аналог boolean), вначале создаете массив бит из нулей и ставите единички когда нужно.

1. замена массива int[64] на 2 int или 1 long (64 bit). Доступ к битам с помощью маски, это быстрая операция.
2. для больших массивов можно использовать bitset https://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html
вам он скорее всего не нужен так как в этом классе накладные расходы не окупятся для 64 бит (2 int | 1 long).

пример работы с маской
Код: java
1.
2.
3.
4.
5.
6.
long i = 0;

// set 1 bit to position 3 from right
i = i | (1 << 3);
//set 1 bit to position 53
i = i | (1 << 53)



Аналогично работа с нулями (логический &) и считыванием (маска и сдвиг вправо на нужное кол-во позиций)

Как выше заметили, задача хорошо распараллеливается но вам пожалуй пока рано за это браться.
Если будет желание посмотрите java thread api, task executor.
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executor.html
http://winterbe.com/posts/2015/04/07/java8-concurrency-tutorial-thread-executor-examples/
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365288
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМожно в 4 Thread запустить разные экземпляры расчетов только задав им разные
условия чтобы пути коней не пересекались. Это нужно для повышения КПД а вовсе
не для решения коллизий. Задейстовать либо Random с разными seed либо hash-функции.


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



maytonИли если рассматривать проблему коня как поиск маршрутов в дереве
то нам достаточно описать простой алгоритм расщепления дерева на 4
поддерева.


это вообще трудно себе представить . как вы сделаете, чтобы в одном потоке робот не лез на клетки другого дерева ?
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365290
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81, кажется вы меня не слышите.

Я уже говорил о том что данное ПО не требует шаринга шахматной доски. В этом суть моего месседжа.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365391
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonandron81, кажется вы меня не слышите.

это непросто .

вы про это ?
maytonВключать в эту модель какой-то глобальный массив нет смысла. Во первых
это замедлит прозводительность. 4 потока будут конкурентно писать туда.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365441
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
uid uniquemain метод запускайте установив переменную Java Xmx (максимальный размер памяти)
java -Xmx1024m ru.sql.forum.samples.Horse (поправьте имя класса)Не нужно этой задаче столько памяти. Похоже, там консоль эклипса валится от флуда
Код: plaintext
1.
2.
 [code=powershell]
io console updater java heap space

...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365447
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanrauid uniquemain метод запускайте установив переменную Java Xmx (максимальный размер памяти)
java -Xmx1024m ru.sql.forum.samples.Horse (поправьте имя класса)Не нужно этой задаче столько памяти. Похоже, там консоль эклипса валится от флуда
Код: plaintext
1.
2.
 [code=powershell]
io console updater java heap space



я об этом уже давно твердил. но в слабость моей компетентности в JAVA к моему мнение никто не прислушивается )))
конечно , не надо. максимальная глубина 64. подумаешь ...
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365451
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, хотел у Вас спросить .

Вот это имеет ли шанс на удачу или же чушь несусветная ?

andron81то есть вы предлагаете просто рандомно , а не последовательно как у нас выбирать следующего кандидата в разных независимых потоках. не ведя никаких проверок на совпадения (а они будут, но не велика проблема)
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365568
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81Atum1 http://algolist.manual.ru/maths/combinat/knight.php

хотя интересное правило Варнсдорфа описано.
но я правило такого не знал. поэтому у меня тупой перебор всего дерева. поэтому видимо и долго

Есть еще правило Эйлера (см вики по данной проблеме)

делаете до упора рекурсию а на остальные ходы делает обход с конца с 64 клетки.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365575
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1
делаете до упора рекурсию а на остальные ходы делает обход с конца с 64 клетки.



не. не прикольно . вероятность, что с 64-ой клетки мы попадём не в стартовую клетку довольно большая.
а задача стоит с известной клетки вести

вот интересно послушать mayton .
Верно ли я его понял, что он предлагал обход дерева осуществлять не последовательно от ветки к ветке , а брать случайную. и всё это в нескольких потоках вести юзая разные массивы.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365934
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот 8 потоков зарядил. задумывал как в предыдущем своём сообщении

Код: 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.
package thread;

public class th {
	public static void main (String[] args) {
   Thread t1 = new Thread(new Logica(1));
   Thread t2 = new Thread(new Logica(2));
   Thread t3 = new Thread(new Logica(3));
   Thread t4 = new Thread(new Logica(4));
   Thread t5 = new Thread(new Logica(5));
   Thread t6 = new Thread(new Logica(6));
   Thread t7 = new Thread(new Logica(7));
   Thread t8 = new Thread(new Logica(8));
   
   t1.start();
   t2.start();
   t3.start();
   t4.start();
   t5.start();
   t6.start();
   t7.start();
   t8.start();
   
}
}



Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
package thread;

import java.util.* ;

public class Logica implements Runnable {

	 int hourseCount = 65;
	    int[][] x = new int[9][9];
	    int[] is = new int[hourseCount];
	    int[] js = new int[hourseCount];
	    long depth = 0;
	    int iStartPos = 1;
	    int jStartPos = 1;
	    int thread_name;
	 public Logica(int t) {
		 thread_name=t;
		 x[iStartPos][jStartPos] = 1;
	        is[1] = iStartPos;
	        js[1] = jStartPos;
	 }
	 
	 
	 public boolean tryHorse(int horseIndex) {
	        boolean success = true;
	        int[] moving;
	        int mc  = (int)(Math.random() * 8);
	        int x1;
	        int y1;
	        depth++;
	       //logger.debug("Глубина = {}", depth);
	      
	        if (horseIndex == 2) {
	            x1 = iStartPos;
	            y1 = jStartPos;
	            is[horseIndex] = x1;
	            js[horseIndex] = y1;
	        }

	        do {
	            moving = moveHorse(mc, is[horseIndex - 1], js[horseIndex - 1]);
	            if (moving[0] != 0 && moving[1] != 0) { //если можно поставить коня
	                x1 = moving[0];
	                y1 = moving[1];

	                x[x1][y1] = horseIndex;/*ставим*/
	                is[horseIndex] = x1;
	                js[horseIndex] = y1;

	              //  logger.debug("Можно !  Передвигаем коня на  x={} y={}, ход {}", x1, y1, horseIndex);
	                //printState();

	                if (horseIndex <= 64) {
	                    success = tryHorse(horseIndex + 1);
	                } 
	                if (horseIndex >= 60) {
	                	
	                	printState();
	                }

	                if (!success) {
	          //          logger.debug("Плохо !  Вынуждены убрать коня с x={} y={} ", is[horseIndex], js[horseIndex]);

	                    x[is[horseIndex]][js[horseIndex]] = 0;
	                    is[horseIndex] = 0;
	                    js[horseIndex] = 0;
	                    success = true;
	                }
	            }
	            mc  = (int)(Math.random() * 8);
	            if (mc == 7) {
	                success = false;
	            }
	        } while (!(!success || mc == 7));

	        depth--;

	        return success;
	    }

	    public int[] moveHorse(int i1, int i, int j) {
	    	int[][] horseMoves = {{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1},{-1,2}};
	        int[] result = new int[2];
	        result[0] = 0;
	        result[1] = 0;
	        int is;
	        int js;

	        //logger.debug("Попытка {} из 8. проверим можно ли передвинуть с {} {} ",i1, i, j);
	        if (i + horseMoves[i1][0] >= 1 && i + horseMoves[i1][0] <= 8 &&
	            j + horseMoves[i1][1] >= 1 && j + horseMoves[i1][1] <= 8
	             && x[(i + horseMoves[i1][0])][(j + horseMoves[i1][1])] == 0
	        		) {
	        	
	            is = i + horseMoves[i1][0];
	            js = j +  horseMoves[i1][1];
	            result[0] = is;
	            result[1] = js;
	        	
	        }
	        
	        return result;
	    }

	    public void printState() {
	        
	    	System.out.println("Поток # "+thread_name);
	            for (int x = 1; x <= 8; x++) {
	                for (int y = 1; y <= 8; y++) {
	                    if (this.x[x][y] > 0) {
	                    	
	                    	System.out.print(this.x[x][y]+" ");

	                    } else if (this.x[x][y] < 0) {
	                     
	                        System.out.print("B ");
	                    } else if (this.x[x][y] == 0) {
	                        System.out.print("0 ");
	                    }
	                }
	                System.out.println();
	            }
	            System.out.println();
	    }
	
	public void run() {

//		 try{
			 tryHorse(2);
			 
//		 }catch(Exception e) {}

	}
}
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365936
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81ну вот 8 потоков зарядил. задумывал как в предыдущем своём сообщении
https://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365943
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

то есть я сделал туфту ? )))
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365949
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81Blazkowicz,

то есть я сделал туфту ? )))
Просто самое время изучить что-то новое и уменьшить немного накал говнокода.
...
Рейтинг: 0 / 0
25 сообщений из 132, страница 3 из 6
Форумы / Java [игнор отключен] [закрыт для гостей] / рекурсивная функция делает переполнение кучи.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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