ホームページ > バックエンド開発 > Python チュートリアル > PyPI の BigQuery データに関する驚くべきこと

PyPI の BigQuery データに関する驚くべきこと

Patricia Arquette
リリース: 2024-11-30 19:59:15
オリジナル
965 人が閲覧しました

Google BigQuery データセットから PyPI パッケージ (またはプロジェクト) のダウンロード番号を取得できます。 Google アカウントと認証情報が必要です。Google は毎月 1 TiB の無料割り当てを提供します。

毎月、過去 30 日間で最も人気のある 8,000 個のパッケージのダウンロード数を自動化して取得し、トップ PyPI パッケージでアクセスしやすい JSON および CSV ファイルとして利用できるようにしています。このデータは、学術界や産業界の研究に広く使用されています。

しかし、より多くのパッケージとリリースが PyPI にアップロードされ、ログに記録されるダウンロードの数が増えると、請求されるデータの量も増加します。

A surprising thing about PyPI

このグラフは、月ごとに請求されるデータ量を示しています。

最初は 4,000 パッケージのダウンロード データのみを収集していましたが、そのデータは 365 日以上のダウンロードと 30 日以上のダウンロードという 2 つのクエリに対して取得されました。しかし、時間が経つにつれて、365 日分のデータをダウンロードするにはあまりにも多くの割り当てを使い始めるようになりました。

そこで、365 日のデータを捨てて、30 日のデータを 4,000 個の荷物から 5,000 個の荷物に増やしました。その後、クォータの使用量を確認し、5,000 パッケージから 8,000 パッケージに増加しました。

しかし、その後、2024 年 7 月のデータ取得の BigQuery 月間割り当て 1 TiB を超えてしまいました。

欠落しているデータを取得して、何が入っているかを調査するために、Google Cloud の 90 日間、300 ドル (€277.46) の無料トライアルを開始しました?

これが私が見つけたものです!

発見: すべてのインストーラーからダウンロードするよりも、pip のみからダウンロード用のデータを取得する方がコストが高くなります。

BigQuery のクエリに pypinfo クライアントを使用しています。デフォルトでは、pip のダウンロードのみを取得します。

ピップのみ

このコマンドは、上位 10 個のパッケージの 1 日分のダウンロード データを取得します。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% を占めています。

その他は紫外線約25%以下です。それらの多くは、以前は除外したかったミラーリング サービスです。

uv の重要性と、uv が今後も大きなシェアを占めるだろうとの私の予想、さらに特に pip だけでフィルタリングするための追加コストを考慮すると、すべてのダウンローダーのデータを取得するように切り替える必要があると思います。さらに、他のものはパイのそれほど多くを占めません。

発見: パッケージの数はコストに影響しない

これが最大の驚きでした。以前は、ノルマ内に収まるように数値を増減していました。しかし、クエリを実行するパッケージの数に違いはないことがわかりました!

1 日だけのデータと、さまざまなパッケージ制限 (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。

1 日繰り返しますが、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 日までの (1 つのパッケージ、すべてのインストーラーに対して) 請求される推定コストとバイト数は次のとおりです (f"pypinfo --all --json --indent 0 --days {days} --limit 1 '' project ")、ほぼ直線的な増加を示しています:

A surprising thing about PyPI

結論

  • データをフェッチするパッケージの数は関係ありません。データ ファイルのサイズに応じて、すべてをフェッチして全員が利用できるようにすることもできます。 8,000 個程度のパッケージを含む小さいファイルを提供することは理にかなっています。多くの場合、必要なのは、大きくても管理可能な数だけです。

  • pip からのダウンロードのみをフィルタリングするとコストが高くなるため、すべてのインストーラーのデータを取得するように切り替えました。

  • 日数はコストに影響するため、割り当て内に収まるように、将来的には日数を減らす必要があります。たとえば、ある時点で 30 日から 25 日に変更し、その後 25 日から 20 日に変更する必要があるかもしれません。

調査の詳細、スクリプト、データ ファイルは、
でご覧いただけます。 hugevk/top-pypi-packages#36.

コストを削減するためのコツを知っている場合は、ぜひ教えてください。


ヘッダー写真: 王立オーストラリア歴史協会による「ニューサウスウェールズ州グレン インズ近くのストーンヘンジ、バランシング ロック」。著作権制限は不明です。

以上がPyPI の BigQuery データに関する驚くべきことの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート