Google BigQuery 데이터 세트에서 PyPI 패키지(또는 프로젝트)의 다운로드 번호를 얻을 수 있습니다. Google 계정과 자격 증명이 필요하며 Google은 매월 1TiB의 무료 할당량을 제공합니다.
매월 지난 30일 동안 가장 인기 있는 8,000개의 패키지에 대한 다운로드 번호를 가져오고 상위 PyPI 패키지에서 더 쉽게 액세스할 수 있는 JSON 및 CSV 파일로 제공하는 자동화 기능이 있습니다. 이 데이터는 학계와 산업체의 연구에 널리 활용됩니다.
그러나 PyPI에 더 많은 패키지와 릴리스가 업로드되고 기록되는 다운로드가 많아질수록 청구되는 데이터의 양도 늘어납니다.
월별 청구되는 데이터 양을 보여주는 차트입니다.
처음에는 4,000개의 패키지에 대한 다운로드 데이터만 수집했는데, 365일 이상 다운로드와 30일 이상 다운로드라는 두 가지 쿼리에 대해 가져왔습니다. 그런데 시간이 지나면서 365일 동안 데이터를 다운로드하기에는 할당량이 너무 많이 소모되기 시작했습니다.
그래서 365일 데이터를 버리고 30일 데이터를 4,000개에서 5,000개로 늘렸습니다. 나중에 할당량을 얼마나 사용하고 있는지 확인해보니 5,000패키지에서 8,000패키지로 늘렸습니다.
그런데 2024년 7월의 BigQuery 월간 데이터 가져오기 할당량인 1TiB를 초과했습니다.
누락된 데이터를 가져오고 무슨 일이 일어나는지 조사하기 위해 Google Cloud의 90일 $300(€277.46) 무료 평가판을 시작했습니다.
제가 찾은 내용은 다음과 같습니다!
저는 pypinfo 클라이언트를 사용하여 BigQuery를 쿼리합니다. 기본적으로 pip에 대한 다운로드만 가져옵니다.
이 명령은 상위 10개 패키지에 대한 일일 다운로드 데이터를 가져옵니다. pip 전용:
$ pypinfo --limit 10 --days 1 "" project Served from cache: False Data processed: 58.21 GiB Data billed: 58.21 GiB Estimated cost: <pre class="brush:php;toolbar:false">$ pypinfo --all --limit 10 --days 1 "" project Served from cache: False Data processed: 46.63 GiB Data billed: 46.63 GiB Estimated cost: <pre class="brush:php;toolbar:false">SELECT file.project as project, COUNT(*) as download_count, FROM `bigquery-public-data.pypi.file_downloads` WHERE timestamp BETWEEN TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -2 DAY) AND TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY) AND details.installer.name = "pip" GROUP BY project ORDER BY download_count DESC LIMIT 10
결과:
project | download count |
---|---|
boto3 | 37,251,744 |
aiobotocore | 16,252,824 |
urllib3 | 16,243,278 |
botocore | 15,687,125 |
requests | 13,271,314 |
s3fs | 12,865,055 |
s3transfer | 12,014,278 |
fsspec | 11,982,305 |
charset-normalizer | 11,684,740 |
certifi | 11,639,584 |
Total | 158,892,247 |
--all 플래그를 추가하면 모든 설치 프로그램에 대해 상위 10개 패키지에 대한 1일 다운로드 데이터를 얻을 수 있습니다.
$ pypinfo --limit 10 --days 1 "" project Served from cache: False Data processed: 58.21 GiB Data billed: 58.21 GiB Estimated cost: <pre class="brush:php;toolbar:false">$ pypinfo --all --limit 10 --days 1 "" project Served from cache: False Data processed: 46.63 GiB Data billed: 46.63 GiB Estimated cost: <pre class="brush:php;toolbar:false">SELECT file.project as project, COUNT(*) as download_count, FROM `bigquery-public-data.pypi.file_downloads` WHERE timestamp BETWEEN TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -2 DAY) AND TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY) AND details.installer.name = "pip" GROUP BY project ORDER BY download_count DESC LIMIT 10
project | download count |
---|---|
boto3 | 39,495,624 |
botocore | 17,281,187 |
urllib3 | 17,225,121 |
aiobotocore | 16,430,826 |
requests | 14,287,965 |
s3fs | 12,958,516 |
charset-normalizer | 12,781,405 |
certifi | 12,647,098 |
setuptools | 12,608,120 |
idna | 12,510,335 |
Total | 168,226,197 |
따라서 기본 pip 전용 비용은 데이터 처리 및 청구에 25%의 추가 비용이 들고 달러로 25%의 추가 비용이 발생하는 것을 볼 수 있습니다.
놀랍지도 않게 실제 다운로드 횟수는 모든 설치 프로그램에서 더 높습니다. 순위는 약간 바뀌었지만 상위 수천 개 결과에는 여전히 거의 동일한 패키지가 나올 것으로 예상됩니다.
pip에 대해서만 BigQuery에 다음과 같은 쿼리를 보냅니다.
SELECT file.project as project, COUNT(*) as download_count, FROM `bigquery-public-data.pypi.file_downloads` WHERE timestamp BETWEEN TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -2 DAY) AND TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY) GROUP BY project ORDER BY download_count DESC LIMIT 10
모든 설치 프로그램의 경우:
$ pypinfo --all --limit 100 --days 1 "" installer Served from cache: False Data processed: 29.49 GiB Data billed: 29.49 GiB Estimated cost: <pre class="brush:php;toolbar:false">SELECT file.project as project, COUNT(*) as download_count, FROM `bigquery-public-data.pypi.file_downloads` WHERE timestamp BETWEEN TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -2 DAY) AND TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY) GROUP BY project ORDER BY download_count DESC LIMIT 8000
이러한 쿼리는 기본값에 추가 AND 세부사항.installer.name = "pip" 조건이 있다는 점을 제외하면 동일합니다. 추가 필터링 작업을 수행하면 비용이 더 많이 드는 것이 합리적입니다.
설치 프로그램을 살펴보겠습니다.
installer name | download count |
---|---|
pip | 1,121,198,711 |
uv | 117,194,833 |
requests | 29,828,272 |
poetry | 23,009,454 |
None | 8,916,745 |
bandersnatch | 6,171,555 |
setuptools | 1,362,797 |
Bazel | 1,280,271 |
Browser | 1,096,328 |
Nexus | 593,230 |
Homebrew | 510,247 |
Artifactory | 69,063 |
pdm | 62,904 |
OS | 13,108 |
devpi | 9,530 |
conda | 2,272 |
pex | 194 |
Total | 1,311,319,514 |
pip는 여전히 가장 인기가 있으며, 놀랍지도 않은 uv도 pip 다운로드의 약 10%를 차지하고 있습니다.
나머지는 UV가 약 25% 이하입니다. 그 중 상당수가 예전에는 제외하고 싶었던 미러링 서비스입니다.
uv의 중요성과 계속해서 파이에서 더 큰 점유율을 차지할 것이라는 예상, 특히 pip만으로 필터링하는 데 드는 추가 비용을 고려하면 모든 다운로더에 대해 데이터를 가져오는 방식으로 전환해야 한다는 의미입니다. 게다가 다른 것들은 파이의 많은 부분을 차지하지 않습니다.
이것이 가장 큰 놀라움이었습니다. 이전에는 할당량을 유지하기 위해 숫자를 늘리거나 줄였습니다. 하지만 쿼리하는 패키지 수는 별 차이가 없는 것으로 나타났습니다!
단 하루 동안의 데이터와 다양한 패키지 제한(1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000)에 대한 모든 설치 프로그램의 데이터를 가져왔습니다. 샘플 쿼리:
$ pypinfo --limit 10 --days 1 "" project Served from cache: False Data processed: 58.21 GiB Data billed: 58.21 GiB Estimated cost: <pre class="brush:php;toolbar:false">$ pypinfo --all --limit 10 --days 1 "" project Served from cache: False Data processed: 46.63 GiB Data billed: 46.63 GiB Estimated cost: <pre class="brush:php;toolbar:false">SELECT file.project as project, COUNT(*) as download_count, FROM `bigquery-public-data.pypi.file_downloads` WHERE timestamp BETWEEN TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -2 DAY) AND TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL -1 DAY) AND details.installer.name = "pip" GROUP BY project ORDER BY download_count DESC LIMIT 10
결과: 흥미롭게도 비용은 모든 한도(1000-8000)에서 동일합니다: $0.31.
하루 동안 반복하지만 pip에 대해서만 필터링:
결과: 비용은 $0.39로 증가했지만 모든 한도에서 다시 동일합니다.
모든 설치 프로그램에 대해 반복하되 30일 동안, 증분 변경에 대해서만 비용을 지불하는 경우를 대비하여 이번에는 감소하는 제한으로 쿼리합니다: 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000:
결과: 역시 비용은 패키지 제한에 관계없이 동일합니다(쿼리당 $4.89).
그럼 한도를 10의 거듭제곱으로 늘려 최대 1,000,000까지 반복해 보겠습니다! 이 마지막 항목은 PyPI의 모든 531,022개 패키지에 대한 데이터를 가져옵니다.
limit | projects count | estimated cost | bytes billed | bytes processed |
---|---|---|---|---|
1 | 1 | 0.20 | 43,447,746,560 | 43,447,720,943 |
10 | 10 | 0.20 | 43,447,746,560 | 43,447,720,943 |
100 | 100 | 0.20 | 43,447,746,560 | 43,447,720,943 |
1000 | 1,000 | 0.20 | 43,447,746,560 | 43,447,720,943 |
8000 | 8,000 | 0.20 | 43,447,746,560 | 43,447,720,943 |
10000 | 10,000 | 0.20 | 43,447,746,560 | 43,447,720,943 |
100000 | 100,000 | 0.20 | 43,447,746,560 | 43,447,720,943 |
1000000 | 531,022 | 0.20 | 43,447,746,560 | 43,447,720,943 |
결과: 1패키지, 531,022패키지 모두 가격은 동일합니다!
놀랍지 않습니다. 365일도 할당량이 많이 걸린다는 것을 앞서 알고 있었고 30일을 계속할 수 있었습니다.
다음은 1일에서 30일 사이에 청구되는 예상 비용 및 바이트(하나의 패키지, 모든 설치 프로그램에 대해)입니다(f"pypinfo --all --json --indent 0 --days {days} --limit 1 '' project "), 대략 선형적인 증가를 보여줍니다:
데이터를 가져오는 패키지 수에 관계없이 데이터 파일의 크기에 따라 모든 패키지를 가져와 모든 사람이 사용할 수 있도록 하는 것이 좋습니다. 8,000개 정도의 패키지가 포함된 더 작은 파일을 제공하는 것이 합리적입니다. 종종 크지만 관리 가능한 숫자만 필요한 경우도 있습니다.
pip에서 다운로드만 필터링하면 비용이 더 많이 들기 때문에 모든 설치 프로그램에 대한 데이터를 가져오는 것으로 전환했습니다.
일수가 비용에 영향을 미치므로 앞으로는 할당량 내에서 이를 줄여야 합니다. 예를 들어, 어느 시점에서는 30일에서 25일로 전환하고 나중에는 25일에서 20일로 전환해야 할 수도 있습니다.
조사에 대한 자세한 내용, 스크립트 및 데이터 파일은
에서 확인할 수 있습니다.
hugovk/top-pypi-packages#36.
그리고 비용 절감 요령을 알고 계시다면 알려주세요!
헤더 사진: "The Balancing Rock, Stonehenge, Near Glen Innes, NSW", Royal Australian Historical Society 제작, 알려진 저작권 제한 없음.
위 내용은 PyPIs BigQuery 데이터의 놀라운 점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!