Python包缓存

2021-03-20 09:21:17

弄清楚如何安装第三方库可以通过学习代码或启动新的侧面项目来脱轨。我们构建了通用包管理器(FOWM for Short),以拯救人们根本不必考虑包装安装。刚刚导入库,按Run,UPM将安装到您的REPT中!

每次运行REPT或REPT唤醒时,UPM都会检查它是否需要下载并安装任何依赖项。这是方便的(无论什么'在你的repl内,它始终需要它需要的依赖关系)但慢速:upm需要下载一个值为数十兆字节的包,提取它们在本地文件系统上,有时也会预先编译它们以获得更好的运行时性能。

或者至少在昨天启用Python软件包缓存之前,至少在昨天速度慢,所以现在最受欢迎的Python软件包在PIP' s缓存(/home/runner/.cache/pip)中预先填充下载步骤将主要消失,绝大多数Python Repls!它还使用预制的轮子尽可能避免使用预编码代码。

它应该尽可能透明,这意味着用户仍然能够将包添加到本地缓存,同时避免复制文件(这将击败首先使用缓存的目的),以及

每个曲柄和#39; S缓存应该彼此独立,以防止交叉缓存攻击(污染,中毒等)。

为了实现两个目标,我们使用的技术使用该技术,即Docker用于在图像之间共享文件:覆盖文件系统。在运行repls的每台计算机上,我们在安装最流行的包后,我们有一个只读的缓存内容的快照。快照是只读绑定到每个RECK中的绑定到/ mnt / cacache。然后,我们将覆盖安装到高速缓存期望它(/home/runner/.cache/pip),使用/ mnt / cacache / pip作为"下部"目录和/ mnt / scratch / cacache_pip / proper(用户可写目录)作为"上部"目录。这意味着无法修改共享文件,每个REPL都有一个复制的缓存的写字视图。

为了保持高速缓存内容新鲜,我们收集关于从PYPI下载的包裹的统计数据,每周都会使用大多数流行的PIP包的列表重建缓存。

由于此,在Repls上,安装包的平均时间下降〜40%。

该名称来自内容可寻址存储(加上"缓存")。所有这一切都需要的属性之一是,当包装到系统中时,它被放置在文件系统中的稳定位置,这取决于包的内容(通常是内容的散列)。每次将安装包时,包安装程序(PIP在Python的情况下)询问包服务器有关包的元数据,包括包的散列。此哈希用于查找文件是否已在缓存中,并使用本地副本而不是下载新的副本。此外,由于包装内容的散列已经可用,因此可以通过将本地副本的散列与预期的副本进行比较来检查内容。

我们将在接下来的几周内为Java(Maven Packages)和JavaScript(NPM软件包)进行相同的待遇,以便在接下来的几周内进行同样的处理,以完成三种最流行的语言。加上一个神秘的"语言"这将很快推出。