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.")