> 백엔드 개발 > 파이썬 튜토리얼 > PyPI&#s BigQuery 데이터의 놀라운 점

PyPI&#s BigQuery 데이터의 놀라운 점

Patricia Arquette
풀어 주다: 2024-11-30 19:59:15
원래의
968명이 탐색했습니다.

Google BigQuery 데이터 세트에서 PyPI 패키지(또는 프로젝트)의 다운로드 번호를 얻을 수 있습니다. Google 계정과 자격 증명이 필요하며 Google은 매월 1TiB의 무료 할당량을 제공합니다.

매월 지난 30일 동안 가장 인기 있는 8,000개의 패키지에 대한 다운로드 번호를 가져오고 상위 PyPI 패키지에서 더 쉽게 액세스할 수 있는 JSON 및 CSV 파일로 제공하는 자동화 기능이 있습니다. 이 데이터는 학계와 산업체의 연구에 널리 활용됩니다.

그러나 PyPI에 더 많은 패키지와 릴리스가 업로드되고 기록되는 다운로드가 많아질수록 청구되는 데이터의 양도 늘어납니다.

A surprising thing about 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) 무료 평가판을 시작했습니다.

제가 찾은 내용은 다음과 같습니다!

발견: 모든 설치 프로그램에서 다운로드하는 것보다 pip에서만 다운로드 데이터를 얻는 데 더 많은 비용이 듭니다.

저는 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
로그인 후 복사
로그인 후 복사
로그인 후 복사
.23 .29

결과:

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
로그인 후 복사
로그인 후 복사
로그인 후 복사
.23 .29
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
로그인 후 복사
.15

이러한 쿼리는 기본값에 추가 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
로그인 후 복사
로그인 후 복사
로그인 후 복사
.23 .29

A surprising thing about PyPI

결과: 흥미롭게도 비용은 모든 한도(1000-8000)에서 동일합니다: $0.31.

하루 동안 반복하지만 pip에 대해서만 필터링:

A surprising thing about PyPI

결과: 비용은 $0.39로 증가했지만 모든 한도에서 다시 동일합니다.

모든 설치 프로그램에 대해 반복하되 30일 동안, 증분 변경에 대해서만 비용을 지불하는 경우를 대비하여 이번에는 감소하는 제한으로 쿼리합니다: 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000:

A surprising thing about PyPI

결과: 역시 비용은 패키지 제한에 관계없이 동일합니다(쿼리당 $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

A surprising thing about PyPI

결과: 1패키지, 531,022패키지 모두 가격은 동일합니다!

조사 결과: 일수가 비용에 영향을 미칩니다.

놀랍지 않습니다. 365일도 할당량이 많이 걸린다는 것을 앞서 알고 있었고 30일을 계속할 수 있었습니다.

다음은 1일에서 30일 사이에 청구되는 예상 비용 및 바이트(하나의 패키지, 모든 설치 프로그램에 대해)입니다(f"pypinfo --all --json --indent 0 --days {days} --limit 1 '' project "), 대략 선형적인 증가를 보여줍니다:

A surprising thing about PyPI

결론

  • 데이터를 가져오는 패키지 수에 관계없이 데이터 파일의 크기에 따라 모든 패키지를 가져와 모든 사람이 사용할 수 있도록 하는 것이 좋습니다. 8,000개 정도의 패키지가 포함된 더 작은 파일을 제공하는 것이 합리적입니다. 종종 크지만 관리 가능한 숫자만 필요한 경우도 있습니다.

  • pip에서 다운로드만 필터링하면 비용이 더 많이 들기 때문에 모든 설치 프로그램에 대한 데이터를 가져오는 것으로 전환했습니다.

  • 일수가 비용에 영향을 미치므로 앞으로는 할당량 내에서 이를 줄여야 합니다. 예를 들어, 어느 시점에서는 30일에서 25일로 전환하고 나중에는 25일에서 20일로 전환해야 할 수도 있습니다.

조사에 대한 자세한 내용, 스크립트 및 데이터 파일은
에서 확인할 수 있습니다. hugovk/top-pypi-packages#36.

그리고 비용 절감 요령을 알고 계시다면 알려주세요!


헤더 사진: "The Balancing Rock, Stonehenge, Near Glen Innes, NSW", Royal Australian Historical Society 제작, 알려진 저작권 제한 없음.

위 내용은 PyPI&#s BigQuery 데이터의 놀라운 점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿