스택큐힙리스트

판다스에서 여러 개의 데이터 프레임을 'read_csv'로 비동기적으로 읽는 이유 - 왜 빠르지 않을까요? 본문

카테고리 없음

판다스에서 여러 개의 데이터 프레임을 'read_csv'로 비동기적으로 읽는 이유 - 왜 빠르지 않을까요?

스택큐힙리스트 2023. 11. 5. 11:48
반응형

import timeit
import pandas as pd
import asyncio
train_to_save = pd.DataFrame(data={'feature1': [1, 2, 3],'period': [1, 1, 1]})
test_to_save = pd.DataFrame(data={'feature1': [1, 4, 12],'period': [2, 2, 2]})
train_to_save.to_csv('train.csv')
test_to_save.to_csv('test.csv')
async def run_async_train():
return pd.read_csv('train.csv')
async def run_async_test():
return pd.read_csv('test.csv')
async def run_train_test_asinc():
df = await asyncio.gather(run_async_train(), run_async_test())
return df
start_async = timeit.default_timer()
async_train,async_test=asyncio.run(run_train_test_asinc())
finish_async = timeit.default_timer()
time_to_run_async=finish_async-start_async
start = timeit.default_timer()
train=pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
finish = timeit.default_timer()
time_to_run_without_async = finish - start
print(time_to_run_async<time_to_run_without_async)

import timeit
import pandas as pd
import asyncio
train_to_save = pd.DataFrame(data={'feature1': [1, 2, 3],'period': [1, 1, 1]})
test_to_save = pd.DataFrame(data={'feature1': [1, 4, 12],'period': [2, 2, 2]})
train_to_save.to_csv('train.csv')
test_to_save.to_csv('test.csv')
async def run_async_train():
return pd.read_csv('train.csv')
async def run_async_test():
return pd.read_csv('test.csv')
async def run_train_test_asinc():
df = await asyncio.gather(run_async_train(), run_async_test())
return df
start_async = timeit.default_timer()
async_train,async_test=asyncio.run(run_train_test_asinc())
finish_async = timeit.default_timer()
time_to_run_async=finish_async-start_async
start = timeit.default_timer()
train=pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
finish = timeit.default_timer()
time_to_run_without_async = finish - start
print(time_to_run_async<time_to_run_without_async)

비 비동기 버전에서는 두 개의 데이터프레임을 왜 더 빠르게 읽는 건가요?


확실하게 말하자면, 저는 실제로 'Bigquery'에서 데이터를 읽을 것이므로 위의 코드를 사용하여 두 요청 (train 및 test)을 속도를 향상시키는 데 흥미가 있습니다.


미리 감사드립니다!

답변 1

pd.read_csv는 비동기 메서드가 아니므로 이 방법으로 실제로 어떤 병렬성을 얻고 있는지는 믿지 않습니다. 비동기 파일 라이브러리인 aiofiles를 사용하여 파일을 비동기적으로 버퍼에 읽은 다음 해당 버퍼를 pd.read_csv(.)에 전달해야합니다.


대부분의 파일 시스템은 실제로 비동기적이지 않으므로 aiofiles는 사실상 스레드 풀입니다. 그러나 일련으로 읽는 것보다 여전히 빠를 것입니다.


다음은 aiohttp를 사용하여 URL에서 csv를 가져오는 예시입니다:

import io
import asyncio
import aiohttp
import pandas as pd
async def get_csv_async(client, url):
# 요청 보내기
async with client.get(url) as response:
# 전체 응답 텍스트를 읽고 StringIO()를 사용하여 파일 형식으로 변환
with io.StringIO(await response.text()) as text_io:
return pd.read_csv(text_io)
async def get_all_csvs_async(urls):
async with aiohttp.ClientSession() as client:
# 먼저 모든 퓨처들을 한 번에 생성
futures = [ get_csv_async(client, url) for url in urls ]
# 그런 다음 모든 퓨처들이 완료될 때까지 기다림
return await asyncio.gather(*futures)
urls = [
# 인터넷에서 가져온 무작위 CSV URL
'https://people.sc.fsu.edu/~jburkardt/data/csv/hw_25000.csv',
'https://people.sc.fsu.edu/~jburkardt/data/csv/addresses.csv',
'https://people.sc.fsu.edu/~jburkardt/data/csv/airtravel.csv',
]
if '__main__' == __name__:
# 이벤트 루프 실행
# python 3.7+에서는 `csvs = asyncio.run(get_all_csvs_async(urls))`로 직접 실행 가능
csvs = asyncio.get_event_loop().run_until_complete(get_all_csvs_async(urls))
for csv in csvs:
print(csv)

답변 2

판다스(pandas)의 'read_csv' 함수는 CSV 파일을 읽어서 데이터 프레임(data frame)으로 변환하는 기능을 제공합니다. 이 함수는 일련의 데이터 프레임을 읽을 때 사용될 수 있지만, 여러 데이터 프레임을 동시에 처리할 때 속도가 향상되지 않는 경우가 있습니다. 이에 대한 이유와 해결책에 대해 알아보겠습니다.
'read_csv' 함수는 파일을 한 번에 하나씩 처리하므로, 여러 개의 파일을 읽을 때에는 순차적으로 처리되어야 합니다. 병렬 처리를 지원하지 않기 때문에, 파일들을 동시에 읽지 못하고 하나씩 처리하는 것이기 때문에 성능 향상을 기대하기 어렵습니다. 이는 대량의 데이터를 처리하거나 파일 개수가 많은 경우 성능 저하를 야기할 수 있습니다.
따라서 여러 개의 데이터 프레임을 동시에 읽어야 할 경우에는 다른 방법을 사용해야 합니다. 하나의 큰 파일로 데이터를 통합하거나, 병렬 처리를 지원하는 다른 라이브러리를 사용하는 것은 성능 향상에 도움이 될 수 있습니다. 또한, 파일을 메모리에 미리 로드하여 읽는 방법을 사용할 수도 있습니다. 메모리에 파일이 로드되면 데이터를 읽는 속도가 가속화되므로, 여러 파일을 순차적으로 읽는 것보다 효율적입니다.
판다스 'read_csv' 함수를 사용하여 여러 개의 데이터 프레임을 동시에 읽을 때 속도가 향상되지 않는 이유와 해결책에 대해 알아보았습니다. 파일 처리를 순차적으로 수행하기 때문에 병렬 처리를 지원하지 않아 성능 저하가 발생할 수 있습니다. 따라서, 대량의 데이터를 처리하거나 파일 개수가 많을 때는 다른 방식을 고려해야 합니다. 이를 통해 효율적인 데이터 처리를 할 수 있을 것입니다.

반응형
Comments