gerimovich_ilya_lab_2 is ready
This commit is contained in:
76
gerimovich_ilya_lab_2/README.md
Normal file
76
gerimovich_ilya_lab_2/README.md
Normal file
@@ -0,0 +1,76 @@
|
||||
# Лабораторная работа №2 Геримович И.М.
|
||||
|
||||
## Описание проекта
|
||||
Данный проект представляет собой распределённое приложение, состоящее из двух микросервисов, которые последовательно обрабатывают данные.
|
||||
Первое приложение анализирует набор файлов во входном каталоге, второе выполняет статистическую обработку над результатами первого.
|
||||
|
||||
## Варианты задач:
|
||||
### Программа 1:
|
||||
Формирует файл /var/result/data.txt так, что каждая строка файла - количество строк в файлах из каталога /var/data.
|
||||
|
||||
### Программа 2:
|
||||
Ищет наибольшее число из файла /var/data/data.txt и сохраняет количество таких чисел из последовательности в /var/result/result.txt.
|
||||
|
||||
|
||||
## Технологии
|
||||
Python 3.11 - язык программирования
|
||||
Docker - контейнеризация приложений
|
||||
Docker Compose - оркестрация контейнеров
|
||||
|
||||
## Архитектура решения
|
||||
┌───────────────────────────────────┐ ┌───────────────────────────────────┐
|
||||
│ PROGRAM 1 │ │ PROGRAM 2 │
|
||||
│ │ │ │
|
||||
│ Сканирует каталог /var/data │ │ Читает файл data.txt │
|
||||
│ Считает строки в каждом файле │──▶│ Находит максимальное число │
|
||||
│ Выводит промежуточные данные: │ │ Подсчитывает частоту максимума │
|
||||
│ • Файл X: N строк │ │ Сохраняет количество чисел │
|
||||
│ • Итого обработано: M файлов │ │ Выводит результат в консоль │
|
||||
│ Записывает data.txt │ │ │
|
||||
└───────────────────────────────────┘ └───────────────────────────────────┘
|
||||
|
||||
|
||||
## Как запустить лабораторную работу
|
||||
Предварительные требования:
|
||||
Установленный Docker
|
||||
Установленный Docker Compose
|
||||
|
||||
docker compose up --build
|
||||
|
||||
### Остановка
|
||||
docker compose down
|
||||
|
||||
# Работа программ:
|
||||
## Program1
|
||||
Сканирует каталог /var/data
|
||||
Для каждого файла подсчитывает количество строк
|
||||
Создает файл /var/result/data.txt, где каждая строка соответствует количеству строк в исходных файлах
|
||||
Результат: файл с числами, представляющими количество строк в каждом файле входного каталога
|
||||
|
||||
## Program2
|
||||
Читает файл /var/data/data.txt, созданный program1
|
||||
Находит максимальное число в файле
|
||||
Подсчитывает, сколько раз это максимальное число встречается в последовательности
|
||||
Сохраняет результат (количество чисел) в файл /var/result/result.txt
|
||||
Выводит результат
|
||||
|
||||
|
||||
## Результат программы:
|
||||
### Промежуточные + итоговые данные:
|
||||
|
||||
program1-1 | Файл file1.txt: 4 строк
|
||||
program1-1 | Файл file2.txt: 9 строк
|
||||
program1-1 | Файл file3.txt: 9 строк
|
||||
program1-1 | Файл file4.txt: 5 строк
|
||||
program1-1 | Программа 1 завершена. Обработано файлов: 4
|
||||
program1-1 | Результат записан в: /var/result/data.txt
|
||||
program1-1 exited with code 0
|
||||
|
||||
program2-1 | Наибольшее число: 9
|
||||
program2-1 | Количество максимальных чисел в последовательности: 2
|
||||
program2-1 | Результат сохранен в: /var/result/result.txt
|
||||
program2-1 exited with code 0
|
||||
|
||||
|
||||
## Видео
|
||||
https://disk.yandex.ru/i/KoSG9k3q3MWfZg
|
||||
26
gerimovich_ilya_lab_2/docker-compose.yml
Normal file
26
gerimovich_ilya_lab_2/docker-compose.yml
Normal file
@@ -0,0 +1,26 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
program1:
|
||||
build:
|
||||
context: ./program1
|
||||
volumes:
|
||||
- ./test-data:/var/data
|
||||
- ./program1-data:/var/result
|
||||
networks:
|
||||
- app-network
|
||||
|
||||
program2:
|
||||
build:
|
||||
context: ./program2
|
||||
volumes:
|
||||
- ./program1-data:/var/data
|
||||
- ./results:/var/result
|
||||
depends_on:
|
||||
- program1
|
||||
networks:
|
||||
- app-network
|
||||
|
||||
networks:
|
||||
app-network:
|
||||
driver: bridge
|
||||
16
gerimovich_ilya_lab_2/program1/Dockerfile
Normal file
16
gerimovich_ilya_lab_2/program1/Dockerfile
Normal file
@@ -0,0 +1,16 @@
|
||||
FROM python:3.11-slim
|
||||
|
||||
# Устанавливаем рабочую директорию
|
||||
WORKDIR /app
|
||||
|
||||
# Копируем файлы приложения
|
||||
COPY app.py .
|
||||
COPY requirements.txt .
|
||||
|
||||
# Устанавливаем зависимости
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Создаем необходимые директории для монтирования
|
||||
RUN mkdir -p /var/data /var/result
|
||||
|
||||
CMD ["python", "app.py"]
|
||||
40
gerimovich_ilya_lab_2/program1/app.py
Normal file
40
gerimovich_ilya_lab_2/program1/app.py
Normal file
@@ -0,0 +1,40 @@
|
||||
import os
|
||||
|
||||
def main():
|
||||
input_dir = "/var/data"
|
||||
output_file = "/var/result/data.txt"
|
||||
|
||||
# Создаем директорию для результатов, если её нет
|
||||
os.makedirs(os.path.dirname(output_file), exist_ok=True)
|
||||
|
||||
try:
|
||||
# Получаем список файлов в директории
|
||||
files = [f for f in os.listdir(input_dir)
|
||||
if os.path.isfile(os.path.join(input_dir, f))]
|
||||
|
||||
line_counts = []
|
||||
|
||||
# Для каждого файла считаем количество строк
|
||||
for filename in files:
|
||||
filepath = os.path.join(input_dir, filename)
|
||||
try:
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
line_count = sum(1 for _ in f)
|
||||
line_counts.append(str(line_count))
|
||||
print(f"Файл {filename}: {line_count} строк")
|
||||
except Exception as e:
|
||||
print(f"Ошибка при обработке файла {filename}: {e}")
|
||||
|
||||
# Записываем результаты в файл
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write('\n'.join(line_counts))
|
||||
|
||||
print(f"Программа 1 завершена. Обработано файлов: {len(files)}")
|
||||
print(f"Результат записан в: {output_file}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Критическая ошибка: {e}")
|
||||
raise
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
0
gerimovich_ilya_lab_2/program1/requirements.txt
Normal file
0
gerimovich_ilya_lab_2/program1/requirements.txt
Normal file
16
gerimovich_ilya_lab_2/program2/Dockerfile
Normal file
16
gerimovich_ilya_lab_2/program2/Dockerfile
Normal file
@@ -0,0 +1,16 @@
|
||||
FROM python:3.11-slim
|
||||
|
||||
# Устанавливаем рабочую директорию
|
||||
WORKDIR /app
|
||||
|
||||
# Копируем файлы приложения
|
||||
COPY app.py .
|
||||
COPY requirements.txt .
|
||||
|
||||
# Устанавливаем зависимости
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# Создаем необходимые директории
|
||||
RUN mkdir -p /var/data /var/result
|
||||
|
||||
CMD ["python", "app.py"]
|
||||
52
gerimovich_ilya_lab_2/program2/app.py
Normal file
52
gerimovich_ilya_lab_2/program2/app.py
Normal file
@@ -0,0 +1,52 @@
|
||||
import os
|
||||
|
||||
def main():
|
||||
input_file = "/var/data/data.txt"
|
||||
output_file = "/var/result/result.txt"
|
||||
|
||||
# Создаем директорию для результатов, если её нет
|
||||
os.makedirs(os.path.dirname(output_file), exist_ok=True)
|
||||
|
||||
try:
|
||||
# Читаем данные из файла
|
||||
numbers = []
|
||||
if os.path.exists(input_file):
|
||||
with open(input_file, 'r', encoding='utf-8') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line: # Пропускаем пустые строки
|
||||
try:
|
||||
numbers.append(int(line))
|
||||
except ValueError:
|
||||
print(f"Предупреждение: некорректное число '{line}' пропущено")
|
||||
|
||||
if not numbers:
|
||||
print("Файл data.txt пуст или содержит только некорректные данные")
|
||||
max_number = 0
|
||||
count = 0
|
||||
else:
|
||||
# Находим максимальное число
|
||||
max_number = max(numbers)
|
||||
|
||||
# Считаем, сколько раз оно встречается
|
||||
count = numbers.count(max_number)
|
||||
|
||||
print(f"Наибольшее число: {max_number}")
|
||||
print(f"Количество максимальных чисел в последовательности: {count}")
|
||||
|
||||
# Сохраняем результат
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
f.write(str(count))
|
||||
|
||||
print(f"Результат сохранен в: {output_file}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Критическая ошибка: {e}")
|
||||
raise
|
||||
except FileNotFoundError:
|
||||
print(f"Ошибка: Файл {input_file} не найден")
|
||||
except ValueError as e:
|
||||
print(f"Ошибка: Неверный формат данных в файле - {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
0
gerimovich_ilya_lab_2/program2/requirements.txt
Normal file
0
gerimovich_ilya_lab_2/program2/requirements.txt
Normal file
Reference in New Issue
Block a user