본문 바로가기

카테고리 없음

플라스크

import requests
import pandas as pd
import json

# API 서버 URL
url = 'http://127.0.0.1:5000/get_data'  # Flask 서버 URL (로컬호스트 예시)

def fetch_data_by_id(data_id):
    # 요청에 보낼 데이터
    data = {
        "id": data_id
    }

    try:
        response = requests.post(url, json=data)
        
        # 응답 상태 코드 확인
        if response.status_code == 200:
            # 성공적인 응답을 받았을 때 처리
            response_data = response.json()
            print(f"ID {data_id}: Success")
            
            # 이미지 데이터가 있으면 파일로 저장
            if 'image' in response_data:
                image_data = response_data['image']
                image_file_path = f"{data_id}_image.jpg"  # 이미지 파일 이름 설정
                
                # 바이너리 데이터 저장
                with open(image_file_path, 'wb') as img_file:
                    img_file.write(image_data.encode('latin1'))  # 'latin1'로 디코딩하여 저장
                print(f"Image saved for ID {data_id}")
            
            # dict로 반환 (이제 DataFrame은 처리하지 않음)
            return response_data
        
        else:
            print(f"ID {data_id}: Error {response.status_code}")
            return None
    except requests.exceptions.RequestException as e:
        print(f"ID {data_id}: Request failed - {e}")
        return None

def fetch_multiple_data(ids):
    for data_id in ids:
        print(f"Fetching data for ID {data_id}...")
        result = fetch_data_by_id(data_id)
        
        if result is not None:
            # 데이터를 처리하는 곳 (예: DataFrame 변환)
            df = pd.DataFrame(result['data'])
            print(f"Data for ID {data_id}:\n", df)
            
            # 원하는 추가 처리 가능 (예: CSV로 저장 등)
            # df.to_csv(f"{data_id}_data.csv", index=False)

# 500개의 id 리스트 예시 (여기서는 1부터 500까지의 숫자)
ids = [str(i) for i in range(1, 501)]

# 여러 id에 대해 데이터 요청
fetch_multiple_data(ids)
import requests
import pandas as pd
import json
import gc

def fetch_data_by_id_in_chunks(data_id):
    # 요청에 보낼 데이터
    data = {
        "id": data_id
    }

    result = {}  # 반환할 dict 초기화
    all_data = []  # DataFrame으로 변환할 데이터 저장

    try:
        # stream=True로 설정하여 데이터가 chunk로 전송되도록 함
        response = requests.post('http://127.0.0.1:5000/get_data', json=data, stream=True)
        
        if response.status_code == 200:
            print(f"ID {data_id}: Success")
            
            # 응답이 chunk로 전송된다면, 이를 처리하는 방법
            for chunk in response.iter_content(chunk_size=1024):  # chunk_size를 조정하여 한 번에 받는 데이터 양을 설정
                if chunk:
                    # chunk를 처리 (예: 데이터 파싱, 저장 등)
                    print(f"Received chunk for ID {data_id}")
                    try:
                        # chunk가 데이터의 일부라면 처리할 수 있도록 변환 (예: JSON)
                        chunk_data = chunk.decode('utf-8')  # 예시로 utf-8로 디코딩
                        
                        # 실제 응답이 JSON 형태라면 파싱하여 처리
                        chunk_json = json.loads(chunk_data)  # 예시로 JSON 파싱
                        
                        # DataFrame 변환
                        if 'data' in chunk_json:
                            df = pd.DataFrame(chunk_json['data'])
                            all_data.append(df)

                        # 이미지 데이터가 있으면 파일로 저장
                        if 'image' in chunk_json:
                            image_data = chunk_json['image']
                            image_file_path = f"{data_id}_image.jpg"
                            with open(image_file_path, 'wb') as img_file:
                                img_file.write(image_data.encode('latin1'))  # 이미지 바이너리 저장
                            print(f"Image saved for ID {data_id}")

                    except Exception as e:
                        print(f"Error processing chunk for ID {data_id}: {e}")
        
            # 데이터를 하나의 DataFrame으로 합침
            if all_data:
                combined_df = pd.concat(all_data, ignore_index=True)
                result['data'] = combined_df
            else:
                result['data'] = pd.DataFrame()  # 데이터가 없으면 빈 DataFrame
            
            # 추가적으로 필요한 정보가 있으면 result dict에 포함
            result['id'] = data_id
        
        else:
            print(f"ID {data_id}: Error {response.status_code}")
            result['data'] = pd.DataFrame()  # 에러 발생 시 빈 DataFrame 반환
            result['id'] = data_id

    except requests.exceptions.RequestException as e:
        print(f"ID {data_id}: Request failed - {e}")
        result['data'] = pd.DataFrame()  # 에러 발생 시 빈 DataFrame 반환
        result['id'] = data_id

    # 메모리 최적화
    del all_data  # 더 이상 사용하지 않는 객체를 삭제
    gc.collect()  # 가비지 컬렉션을 강제로 실행하여 메모리 확보

    return result

def fetch_data_in_batches(ids):
    all_results = []  # 모든 결과를 저장할 리스트
    
    for data_id in ids:
        print(f"Fetching data for ID {data_id}...")
        result = fetch_data_by_id_in_chunks(data_id)
        
        if result is not None:
            all_results.append(result)
    
    # 결과를 하나의 DataFrame으로 합침
    return all_results

# 500개의 id 리스트 예시 (여기서는 1부터 500까지의 숫자)
ids = [str(i) for i in range(1, 501)]

# 여러 id에 대해 데이터 요청
all_results = fetch_data_in_batches(ids)

# 결과 출력 (예시로 500개의 결과 출력, 실제로는 데이터프레임에 저장하거나 CSV로 저장할 수 있음)
print(f"All results for 500 IDs: {len(all_results)} results fetched.")