forked from Alexey/DAS_2024_1
Compare commits
3 Commits
mochalov_d
...
dozorova_a
| Author | SHA1 | Date | |
|---|---|---|---|
| 022e2dc49e | |||
| a54e13f7ee | |||
| 1bb988ea2f |
3
.gitignore → dozorova_alena_lab_6/.gitignore
vendored
3
.gitignore → dozorova_alena_lab_6/.gitignore
vendored
@@ -7,3 +7,6 @@
|
||||
/dozorova_alena_lab_2/ConsoleApp2/.vs
|
||||
/dozorova_alena_lab_2/ConsoleApp2/bin
|
||||
/dozorova_alena_lab_2/ConsoleApp2/obj
|
||||
/dozorova_alena_lab_6/ConsoleApp1/.vs
|
||||
/dozorova_alena_lab_6/ConsoleApp1/bin
|
||||
/dozorova_alena_lab_6/ConsoleApp1/obj
|
||||
10
dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.csproj
Normal file
10
dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.csproj
Normal file
@@ -0,0 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
25
dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.sln
Normal file
25
dozorova_alena_lab_6/ConsoleApp1/ConsoleApp1.sln
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.10.35004.147
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp1", "ConsoleApp1.csproj", "{29269567-7466-4C99-BEEF-F5766BDDFB24}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{29269567-7466-4C99-BEEF-F5766BDDFB24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{29269567-7466-4C99-BEEF-F5766BDDFB24}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{29269567-7466-4C99-BEEF-F5766BDDFB24}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{29269567-7466-4C99-BEEF-F5766BDDFB24}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {EDED6E1D-0A86-43F9-94EA-6ADCC1FA1B42}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
55
dozorova_alena_lab_6/ConsoleApp1/Extention.cs
Normal file
55
dozorova_alena_lab_6/ConsoleApp1/Extention.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ConsoleApp1
|
||||
{
|
||||
public static class Extention
|
||||
{
|
||||
public static int[,] CreateMatrixWithoutColumn(this int[,] matrix, int column)
|
||||
{
|
||||
var result = new int[matrix.GetLength(0), matrix.GetLength(1) - 1];
|
||||
for (int i = 0; i < matrix.GetLength(0); i++)
|
||||
{
|
||||
for (int j = 0; j < matrix.GetLength(1) - 1; j++)
|
||||
{
|
||||
result[i, j] = j < column ? matrix[i, j] : matrix[i, j + 1];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static int[,] CreateMatrixWithoutRow(this int[,] matrix, int row)
|
||||
{
|
||||
var result = new int[matrix.GetLength(0) - 1, matrix.GetLength(1)];
|
||||
for (int i = 0; i < matrix.GetLength(0) - 1; i++)
|
||||
{
|
||||
for (int j = 0; j < matrix.GetLength(1); j++)
|
||||
{
|
||||
result[i, j] = i < row ? matrix[i, j] : matrix[i + 1, j];
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static double CalculateDeterminant(this int[,] matrix)
|
||||
{
|
||||
if (matrix.GetLength(0) == 2)
|
||||
{
|
||||
return matrix[0, 0] * matrix[1, 1] - matrix[0, 1] * matrix[1, 0];
|
||||
}
|
||||
double result = 0;
|
||||
for (var j = 0; j < matrix.GetLength(0); j++)
|
||||
{
|
||||
result += (j % 2 == 1 ? 1 : -1) * matrix[1, j] *
|
||||
matrix.CreateMatrixWithoutColumn(j).CreateMatrixWithoutRow(1).CalculateDeterminant();
|
||||
}
|
||||
//Console.WriteLine("Ко мне пришли с размером " + matrix.GetLength(0));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
87
dozorova_alena_lab_6/ConsoleApp1/Program.cs
Normal file
87
dozorova_alena_lab_6/ConsoleApp1/Program.cs
Normal file
@@ -0,0 +1,87 @@
|
||||
|
||||
using ConsoleApp1;
|
||||
using System.Data.Common;
|
||||
using System.Diagnostics;
|
||||
internal class Program
|
||||
{
|
||||
private static void Main(string[] args)
|
||||
{
|
||||
var value = new int[3] {100, 300, 500 };
|
||||
|
||||
foreach(var i in value)
|
||||
{
|
||||
var a = CreateMatrix(i, i);
|
||||
var b = CreateMatrix(i, i);
|
||||
|
||||
List<long> times = new() {};
|
||||
Console.WriteLine("Для пяти потоков: ");
|
||||
for (int j = 1; j <= 10; j++)
|
||||
{
|
||||
var sw = new Stopwatch();
|
||||
sw.Start();
|
||||
|
||||
Calculate(a, j);
|
||||
|
||||
sw.Stop();
|
||||
times.Add(sw.ElapsedTicks);
|
||||
}
|
||||
Console.WriteLine("Количество тиков для вычисления матрицы стороной "+i+": "+string.Join("\t", times));
|
||||
|
||||
Console.WriteLine("Для десяти потоков: ");
|
||||
for (int j = 1; j <= 10; j++)
|
||||
{
|
||||
var sw = new Stopwatch();
|
||||
sw.Start();
|
||||
|
||||
Calculate(a, j);
|
||||
|
||||
sw.Stop();
|
||||
times.Add(sw.ElapsedTicks);
|
||||
}
|
||||
Console.WriteLine("Количество тиков для вычисления матрицы стороной " + i + ": " + string.Join("\t", times));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private static int[,] CreateMatrix(int x, int y)
|
||||
{
|
||||
var rnd = new Random();
|
||||
|
||||
var res = new int[y, x];
|
||||
|
||||
for (int i = 0; i < y; i++)
|
||||
{
|
||||
for (int j = 0; j < x; j++)
|
||||
{
|
||||
res[i, j] = rnd.Next(0, 100);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
private static double Calculate(int[,] matrix, int maxTask)
|
||||
{
|
||||
double res = 0;
|
||||
|
||||
var semaphore = new SemaphoreSlim(maxTask, maxTask);
|
||||
|
||||
for (var j = 0; j < matrix.GetLength(0) - 1; j++)
|
||||
{
|
||||
_ = Task.Run(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
semaphore.Wait();
|
||||
res += (j % 2 == 1 ? 1 : -1) * matrix[1, j] *
|
||||
matrix.CreateMatrixWithoutColumn(j).
|
||||
CreateMatrixWithoutRow(1).CalculateDeterminant();
|
||||
}
|
||||
finally { semaphore.Release(); }
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
semaphore.Wait(maxTask);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
18
dozorova_alena_lab_6/README.md
Normal file
18
dozorova_alena_lab_6/README.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# Лабораторная работа 6
|
||||
В рамках данной работы мы изучаем выигрыш при распаралелливании процесса вычисления определителя матрицы
|
||||
## Описание
|
||||
Для вычисления определителя мы используем следующую формулу:
|
||||

|
||||
где  - определитель матрицы, полученной из исходной вырезанием 1 строки и j столбца.
|
||||
|
||||
## Запуск
|
||||
По опыту прошлой лабораторной работы, в консольном приложении был реализован алгоритм вычисление детерминанта и запущено сравнение затраченного времени (в тиках) для 5 и 10 потоков.
|
||||
## Результаты
|
||||
Результаты:
|
||||
<br/>
|
||||

|
||||
<br/>
|
||||
Как мы видим, подтверждаются выводы прошлой лабораторной работы: для небольших матриц выигрыш несущественнен из-за затраты времени на работу с потоком, а для больших эта разница в скорости уже существенна
|
||||
|
||||
## Видеодемонстрация
|
||||
Видеодемонстрация по [адресу](https://drive.google.com/file/d/1LFRNbTAOzg21Du60Ehy9u6HOp9D3sKPm/view?usp=sharing)
|
||||
BIN
dozorova_alena_lab_6/image-1.png
Normal file
BIN
dozorova_alena_lab_6/image-1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 556 B |
BIN
dozorova_alena_lab_6/image-2.png
Normal file
BIN
dozorova_alena_lab_6/image-2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 67 KiB |
BIN
dozorova_alena_lab_6/image.png
Normal file
BIN
dozorova_alena_lab_6/image.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.3 KiB |
2
mochalov_danila_lab_2/.gitignore
vendored
2
mochalov_danila_lab_2/.gitignore
vendored
@@ -1,2 +0,0 @@
|
||||
data
|
||||
result
|
||||
@@ -1,38 +0,0 @@
|
||||
# Лабораторная работа №2
|
||||
#### ПИбд-42. Мочалов Данила.
|
||||
|
||||
#### Задание:
|
||||
Для выполнения лабораторной работы были выбраны следущие варианты программ:
|
||||
- Ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt.
|
||||
- Сохраняет произведение первого и последнего числа из файла /var/data/data.txt в /var/result/result.txt.
|
||||
Так как по заданию исходными данными для второй программы должен быть результат выполнения первой программы, было принято решение для второй программы брать данные из файла */var/result/data.txt*
|
||||
Также было принято решение генерировать файлы для выполнения первой программы в ней же.
|
||||
|
||||
#### При выполнении использовал:
|
||||
- Python 3.12
|
||||
- Docker
|
||||
- Docker Compose
|
||||
|
||||
#### Инструкция:
|
||||
Для запуска лабораторной работы, перейдите в папку *mochalov_danila_lab_2* и выполните команду:
|
||||
```
|
||||
docker-compose up --build
|
||||
```
|
||||
|
||||
#### Результат
|
||||
```
|
||||
[+] Running 3/3
|
||||
✔ Network mochalov_danila_lab_2_default Created 0.1s
|
||||
✔ Container mochalov_danila_lab_2-app_1-1 Created 0.1s
|
||||
✔ Container mochalov_danila_lab_2-app_2-1 Created 0.1s
|
||||
Attaching to app_1-1, app_2-1
|
||||
app_1-1 | Создано 19 файлов в директории /var/data.
|
||||
app_1-1 | Самый большой файл: /var/data/file_3.txt (288 байт) скопирован в /var/result/data.txt.
|
||||
app_2-1 | Произведение первого и последнего числа (55 * 1) = 55 сохранено в /var/result/result.txt.
|
||||
|
||||
app_1-1 exited with code 0
|
||||
app_2-1 exited with code 0
|
||||
```
|
||||
|
||||
#### Демонстрация работы
|
||||
Доступна по [ссылке](https://drive.google.com/file/d/1Z0T5dYIZ4s3_MstOLmLX86JN072SDpea/view?usp=sharing)
|
||||
@@ -1,8 +0,0 @@
|
||||
# Образ с Python 3.12
|
||||
FROM python:3.12
|
||||
# Указываем рабочую директорию
|
||||
WORKDIR /app
|
||||
# Копируем в нее файл скрипта
|
||||
COPY app_1.py .
|
||||
# Команда запуска скрипта
|
||||
CMD ["python", "app_1.py"]
|
||||
@@ -1,64 +0,0 @@
|
||||
import os
|
||||
import random
|
||||
import shutil
|
||||
|
||||
# Директории
|
||||
source_directory = "/var/data"
|
||||
destination_directory = "/var/result"
|
||||
destination_file = os.path.join(destination_directory, "data.txt")
|
||||
|
||||
# Генерация файлов
|
||||
def generate_random_files(directory):
|
||||
# Убедимся, что директория существует
|
||||
os.makedirs(directory, exist_ok=True)
|
||||
|
||||
# Генерируем случайное количество файлов (от 10 до 20)
|
||||
num_files = random.randint(10, 20)
|
||||
|
||||
for i in range(1, num_files + 1):
|
||||
# Указываем имя файла
|
||||
file_name = f"file_{i}.txt"
|
||||
file_path = os.path.join(directory, file_name)
|
||||
|
||||
# Генерируем случайное количество чисел (от 5 до 100)
|
||||
num_numbers = random.randint(5, 100)
|
||||
numbers = [str(random.randint(0, 100)) for _ in range(num_numbers)]
|
||||
|
||||
# Записываем числа в файл, каждое с новой строки
|
||||
with open(file_path, 'w') as f:
|
||||
f.write("\n".join(numbers))
|
||||
|
||||
print(f"Создано {num_files} файлов в директории {directory}.")
|
||||
|
||||
# Поиск и копирование самого большого файла
|
||||
def find_and_copy_largest_file(source_directory, destination_directory, destination_file):
|
||||
# Убедимся, что директория назначения существует
|
||||
os.makedirs(destination_directory, exist_ok=True)
|
||||
|
||||
# Поиск самого большого файла
|
||||
largest_file = None
|
||||
largest_size = 0
|
||||
|
||||
for file_name in os.listdir(source_directory):
|
||||
file_path = os.path.join(source_directory, file_name)
|
||||
|
||||
if os.path.isfile(file_path):
|
||||
file_size = os.path.getsize(file_path)
|
||||
|
||||
if file_size > largest_size:
|
||||
largest_size = file_size
|
||||
largest_file = file_path
|
||||
|
||||
# Если найден самый большой файл, копируем его содержимое
|
||||
if largest_file:
|
||||
shutil.copy(largest_file, destination_file)
|
||||
print(f"Самый большой файл: {largest_file} ({largest_size} байт) скопирован в {destination_file}.")
|
||||
else:
|
||||
print("В каталоге нет файлов для копирования.")
|
||||
|
||||
def main():
|
||||
generate_random_files(source_directory)
|
||||
find_and_copy_largest_file(source_directory, destination_directory, destination_file)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,8 +0,0 @@
|
||||
# Образ с Python 3.12
|
||||
FROM python:3.12
|
||||
# Указываем рабочую директорию
|
||||
WORKDIR /app
|
||||
# Копируем в нее файл скрипта
|
||||
COPY app_2.py .
|
||||
# Команда запуска скрипта
|
||||
CMD ["python", "app_2.py"]
|
||||
@@ -1,40 +0,0 @@
|
||||
import os
|
||||
|
||||
# Пути к файлам
|
||||
data_file = "/var/result/data.txt"
|
||||
result_file = "/var/result/result.txt"
|
||||
|
||||
# Функция для вычисления произведения первого и последнего числа
|
||||
def calculate(data_file, result_file):
|
||||
try:
|
||||
# Открываем файл и читаем строки
|
||||
with open(data_file, 'r') as f:
|
||||
numbers = f.readlines()
|
||||
|
||||
# Преобразуем строки в числа, убирая лишние символы
|
||||
numbers = [int(num.strip()) for num in numbers if num.strip().isdigit()]
|
||||
|
||||
if len(numbers) < 2:
|
||||
print("Недостаточно чисел в файле для вычисления произведения.")
|
||||
return
|
||||
|
||||
# Первое и последнее числа
|
||||
first_number = numbers[0]
|
||||
last_number = numbers[-1]
|
||||
|
||||
# Вычисляем произведение
|
||||
product = first_number * last_number
|
||||
|
||||
# Записываем результат в файл
|
||||
with open(result_file, 'w') as f:
|
||||
f.write(str(product))
|
||||
|
||||
print(f"Произведение первого и последнего числа ({first_number} * {last_number}) = {product} сохранено в {result_file}.")
|
||||
|
||||
except FileNotFoundError:
|
||||
print(f"Файл {data_file} не найден.")
|
||||
except ValueError:
|
||||
print("Ошибка в данных файла. Убедитесь, что файл содержит только числа.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
calculate(data_file, result_file)
|
||||
@@ -1,18 +0,0 @@
|
||||
services:
|
||||
# Сервис с первым скриптом
|
||||
app_1:
|
||||
build:
|
||||
context: ./app_1/ # Указываем путь к директории скрипта и Dockerfile
|
||||
volumes: # Монтируем локальную директорию с данными в /var/data и локальную директорию с результирующими данными в /var/result
|
||||
- ./data:/var/data
|
||||
- ./result:/var/result
|
||||
|
||||
# Сервис со вторым скриптом
|
||||
app_2:
|
||||
depends_on: # Выполняем второй скрипт после завершения первого
|
||||
- app_1
|
||||
build:
|
||||
context: ./app_2/ # Указываем путь к директории скрипта и Dockerfile
|
||||
volumes: # Монтируем локальную директорию с данными в /var/data и локальную директорию с результирующими данными в /var/result
|
||||
- ./data:/var/data
|
||||
- ./result:/var/result
|
||||
Reference in New Issue
Block a user