forked from sevastyan_b/SSPR_25
Добавление описания ключевых моментов кода
This commit is contained in:
@@ -28,6 +28,96 @@
|
||||
3. Паралелльая обработка матрицы и поиск каждым сервисом локального максимума в каждой половине.
|
||||
4. Определение глобального максимума
|
||||
|
||||
**Обзор работы программы**
|
||||
|
||||
Программа реализует распределенные вычисления в два контейнера.
|
||||
|
||||
1. Первый контейнер генерирует матрицу размером 1000*1000
|
||||
```
|
||||
int[][] matrix = generateRandomMatrix(1000, 1000);
|
||||
|
||||
private static int[][] generateRandomMatrix(int rows, int columns) {
|
||||
int[][] matrix = new int[rows][columns];
|
||||
Random random = new Random();
|
||||
for (int i = 0; i < rows; i++) {
|
||||
for (int j = 0; j < columns; j++) {
|
||||
matrix[i][j] = random.nextInt(100_000);
|
||||
}
|
||||
}
|
||||
return matrix;
|
||||
}
|
||||
```
|
||||
|
||||
2. Затем в первом контейнер происходит разделение матрицы на две части
|
||||
```
|
||||
int half = matrix.length / 2;
|
||||
int[][] firstHalf = new int[half][matrix[0].length];
|
||||
int[][] secondHalf = new int[matrix.length - half][matrix[0].length];
|
||||
for (int i = 0; i < matrix.length; i++) {
|
||||
if (i < half) {
|
||||
firstHalf[i] = matrix[i];
|
||||
} else {
|
||||
secondHalf[i - half] = matrix[i];
|
||||
}
|
||||
}
|
||||
```
|
||||
Первая половина будет обрабатываться локально, вторая половина будет обрабатывать на втором контейнере
|
||||
|
||||
|
||||
3. Распределенная обработка массива
|
||||
|
||||
Отправляем вторую половину матрицы во второй контейнер.
|
||||
```
|
||||
//создание объекта RestTemplate для выполнения HTTP-запроса
|
||||
RestTemplate restTemplate = new RestTemplate();
|
||||
//url адрес второго контейнера
|
||||
String secondContainerUrl = "http://192.168.5.107:8080/matrix/max";
|
||||
//отправка пост запроса второй половины матрицы на второй контейнер
|
||||
ResponseEntity<Integer> response = restTemplate.postForEntity(secondContainerUrl, secondHalf, Integer.class);
|
||||
```
|
||||
|
||||
Затем происходит поиск максимума в каждой половине массива.
|
||||
|
||||
В первом контейнере обработка половины массива происходит локально
|
||||
```
|
||||
private static int findMaxElement(int[][] matrix) {
|
||||
int max = Integer.MIN_VALUE;
|
||||
for (int[] row : matrix) {
|
||||
for (int value : row) {
|
||||
if (value > max) {
|
||||
max = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return max;
|
||||
}
|
||||
```
|
||||
|
||||
Второй контейнер принимает половину матрицы, обрабатывает и отправляет обратно в первый контейнер
|
||||
```
|
||||
public int processMatrix(@RequestBody int[][] matrix) {
|
||||
System.out.println("Server start find max");
|
||||
int min = Integer.MAX_VALUE;
|
||||
for (int[] row : matrix) {
|
||||
for (int value : row) {
|
||||
if (value < min) {
|
||||
min = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return min;
|
||||
}
|
||||
```
|
||||
|
||||
Получение результата из второго контейнера и поиск глобального максимума из двух контейнеров
|
||||
```
|
||||
int localMax = findMaxElement(firstHalf);
|
||||
//получение ответа из второго контейнера
|
||||
int remoteMax = response.getBody();
|
||||
int globalMax = Math.max(localMax, remoteMax);
|
||||
```
|
||||
|
||||
|
||||
**Тесты**
|
||||
|
||||
Вывод первого контейнера
|
||||
|
||||
Reference in New Issue
Block a user