Google BigQuery データセットから PyPI パッケージ (またはプロジェクト) のダウンロード番号を取得できます。 Google アカウントと認証情報が必要です。Google は毎月 1 TiB の無料割り当てを提供します。
毎月、過去 30 日間で最も人気のある 8,000 個のパッケージのダウンロード数を自動化して取得し、トップ PyPI パッケージでアクセスしやすい JSON および CSV ファイルとして利用できるようにしています。このデータは、学術界や産業界の研究に広く使用されています。
しかし、より多くのパッケージとリリースが 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) の無料トライアルを開始しました?
これが私が見つけたものです!
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
結果:
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% を占めています。
その他は紫外線約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
結果: 興味深いことに、コストはすべての制限 (1000 ~ 8000) で同じです: $0.31。
1 日繰り返しますが、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 日までの (1 つのパッケージ、すべてのインストーラーに対して) 請求される推定コストとバイト数は次のとおりです (f"pypinfo --all --json --indent 0 --days {days} --limit 1 '' project ")、ほぼ直線的な増加を示しています:
データをフェッチするパッケージの数は関係ありません。データ ファイルのサイズに応じて、すべてをフェッチして全員が利用できるようにすることもできます。 8,000 個程度のパッケージを含む小さいファイルを提供することは理にかなっています。多くの場合、必要なのは、大きくても管理可能な数だけです。
pip からのダウンロードのみをフィルタリングするとコストが高くなるため、すべてのインストーラーのデータを取得するように切り替えました。
日数はコストに影響するため、割り当て内に収まるように、将来的には日数を減らす必要があります。たとえば、ある時点で 30 日から 25 日に変更し、その後 25 日から 20 日に変更する必要があるかもしれません。
調査の詳細、スクリプト、データ ファイルは、
でご覧いただけます。
hugevk/top-pypi-packages#36.
コストを削減するためのコツを知っている場合は、ぜひ教えてください。
ヘッダー写真: 王立オーストラリア歴史協会による「ニューサウスウェールズ州グレン インズ近くのストーンヘンジ、バランシング ロック」。著作権制限は不明です。
以上がPyPI の BigQuery データに関する驚くべきことの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。