본문 바로가기
-----ETC-----/C++ 성능 최적화 및 고급 테크닉 시리즈

[C++ 성능 최적화 및 고급 테크닉] Day 27: 프로젝트: 실시간 데이터 처리 시스템 개발 (1)

by cogito21_cpp 2024. 8. 1.
반응형

프로젝트 개요

실시간 데이터 처리 시스템은 대규모 데이터를 실시간으로 처리하고 분석하는 시스템입니다. 이번 프로젝트에서는 실시간 데이터 처리 시스템의 기초를 다지고, 기본적인 데이터 처리 파이프라인을 구현합니다.

 

프로젝트 목표

  1. 데이터 수집: 외부 소스로부터 데이터를 실시간으로 수집합니다.
  2. 데이터 처리: 수집된 데이터를 실시간으로 처리하고 분석합니다.
  3. 데이터 저장: 처리된 데이터를 저장하여 나중에 분석할 수 있도록 합니다.

 

Step 1: 데이터 수집

데이터 수집은 외부 소스(예: 센서, 로그 파일 등)에서 데이터를 받아오는 과정입니다. 이 프로젝트에서는 파일에서 데이터를 읽어오는 방식으로 데이터 수집을 구현합니다.

 

DataCollector 클래스 설계

DataCollector.h

#ifndef DATACOLLECTOR_H
#define DATACOLLECTOR_H

#include <string>
#include <queue>
#include <mutex>
#include <condition_variable>

class DataCollector {
private:
    std::queue<std::string> dataQueue;
    std::mutex mtx;
    std::condition_variable cv;

public:
    void collectData(const std::string& fileName);
    std::string getNextData();
};

#endif // DATACOLLECTOR_H

 

DataCollector.cpp

#include "DataCollector.h"
#include <fstream>
#include <iostream>

void DataCollector::collectData(const std::string& fileName) {
    std::ifstream file(fileName);
    if (!file) {
        std::cerr << "Failed to open file: " << fileName << std::endl;
        return;
    }

    std::string line;
    while (std::getline(file, line)) {
        std::unique_lock<std::mutex> lock(mtx);
        dataQueue.push(line);
        cv.notify_one();
    }
}

std::string DataCollector::getNextData() {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [this] { return !dataQueue.empty(); });
    std::string data = dataQueue.front();
    dataQueue.pop();
    return data;
}

 

Step 2: 데이터 처리

데이터 처리는 수집된 데이터를 실시간으로 분석하고 처리하는 과정입니다. 이 프로젝트에서는 간단한 문자열 처리 예제를 구현합니다.

 

DataProcessor 클래스 설계

DataProcessor.h

#ifndef DATAPROCESSOR_H
#define DATAPROCESSOR_H

#include <string>

class DataProcessor {
public:
    void processData(const std::string& data);
};

#endif // DATAPROCESSOR_H

 

DataProcessor.cpp

#include "DataProcessor.h"
#include <iostream>

void DataProcessor::processData(const std::string& data) {
    // 예제: 데이터의 길이를 출력
    std::cout << "Processed data: " << data << ", length: " << data.length() << std::endl;
}

 

Step 3: 데이터 저장

데이터 저장은 처리된 데이터를 저장하여 나중에 분석할 수 있도록 하는 과정입니다. 이 프로젝트에서는 간단히 파일에 데이터를 저장합니다.

 

DataStorage 클래스 설계

DataStorage.h

#ifndef DATASTORAGE_H
#define DATASTORAGE_H

#include <string>

class DataStorage {
public:
    void storeData(const std::string& data, const std::string& fileName);
};

#endif // DATASTORAGE_H

 

DataStorage.cpp

#include "DataStorage.h"
#include <fstream>
#include <iostream>

void DataStorage::storeData(const std::string& data, const std::string& fileName) {
    std::ofstream file(fileName, std::ios::app);
    if (!file) {
        std::cerr << "Failed to open file: " << fileName << std::endl;
        return;
    }

    file << data << std::endl;
}

 

통합 테스트

데이터 수집, 처리, 저장 과정을 통합하여 테스트합니다.

 

main.cpp

#include "DataCollector.h"
#include "DataProcessor.h"
#include "DataStorage.h"
#include <thread>
#include <vector>

int main() {
    DataCollector collector;
    DataProcessor processor;
    DataStorage storage;

    // 데이터 수집 스레드
    std::thread collectorThread([&collector]() {
        collector.collectData("data.txt");
    });

    // 데이터 처리 및 저장 스레드
    std::vector<std::thread> processorThreads;
    for (int i = 0; i < 4; ++i) {
        processorThreads.push_back(std::thread([&collector, &processor, &storage]() {
            while (true) {
                std::string data = collector.getNextData();
                processor.processData(data);
                storage.storeData(data, "processed_data.txt");
            }
        }));
    }

    collectorThread.join();
    for (auto& t : processorThreads) {
        t.join();
    }

    return 0;
}

 

데이터 파일 준비

데이터 수집을 테스트하기 위해 data.txt 파일을 준비합니다. 이 파일에는 테스트할 데이터가 포함되어야 합니다.

data.txt

Sample data line 1
Sample data line 2
Sample data line 3

 

이제 스물일곱 번째 날의 학습을 마쳤습니다. 실시간 데이터 처리 시스템 개발 프로젝트의 첫 단계를 통해 데이터 수집, 처리, 저장의 기본적인 기능을 구현했습니다.

질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "프로젝트: 실시간 데이터 처리 시스템 개발 (2)"에 대해 학습하겠습니다.

반응형