跳转到主要内容

结构化科学数据访问服务

项目描述

Tiled

Tiled是一个为数据感知门户和数据科学工具提供数据访问服务的系统。Tiled拥有Python客户端,并能与Python数据科学库自然集成,但该服务本身并非Python特定;它还可以通过网页浏览器或任何互联网连接的程序使用。

Tiled的服务可以位于数据库、文件系统或远程服务之上,以实现以可扩展的适当格式进行数据搜索和结构化、分块访问,无论数据以何种格式存储,都提供一致的结构。原生支持的格式包括缓慢但广泛使用的交换格式(例如CSV、JSON)和快速、高效的格式(例如C缓冲区、Apache Arrow和Parquet)。Tiled允许切片和子选择,以便只读取和传输感兴趣的数据,并允许一次性并行下载多个数据块。用户可以使用非常轻量级的软件依赖关系和快速的部分下载来访问数据。

Tiled强调的是结构而不是格式,包括

  • N维步进数组(即类似numpy的数组)
  • 稀疏数组
  • 表格数据(例如类似pandas的“dataframes”)
  • 嵌套、可变大小的数据(由AwkwardArray实现)
  • 这些结构的层次结构(例如xarrays,与NeXus兼容的结构)

Tiled基于Web安全标准的可扩展访问控制实施,类似于JuptyerHub。与Jupyter一样,Tiled可以由单个用户使用或作为共享的公共或私有资源部署。Tiled可以配置为使用第三方服务进行登录,例如Google、ORCID或任何OIDC或SAML身份验证提供商。

Tiled在标准的网页浏览器或Tiled的Python客户端中促进客户端缓存,从而有效地使用带宽。它使用“热点”数据集和资源的服务端缓存来加速重复请求(例如,当多个用户请求相同的数据块时)以及针对同一数据集不同部分的独特请求(例如,当用户从数据集中请求各种切片或列时)。

分发 获取方式
PyPI pip install tiled
Conda conda install -c conda-forge tiled-client tiled-server
源代码 github.com/bluesky/tiled
文档 blueskyproject.io/tiled

示例

在这个示例中,我们将提供在内存中生成的数据集。或者,它也可以从文件目录、网络资源、数据库或这些的组合中按需读取。

tiled serve demo
# equivalent to:
# tiled serve pyobject --public tiled.examples.generated:tree

然后可以通过Python客户端、网页浏览器或任何HTTP客户端高效地访问数据。

>>> from tiled.client import from_uri

>>> client = from_uri("https://127.0.0.1:8000")

>>> client
<Container {'short_table', 'long_table', 'structured_data', ...} ~10 entries>

>>> list(client)
'big_image',
 'small_image',
 'tiny_image',
 'tiny_cube',
 'tiny_hypercube',
 'low_entropy',
 'high_entropy',
 'short_table',
 'long_table',
 'labeled_data',
 'structured_data']

>>> client['medium_image']
<ArrayClient>

>>> client['medium_image'][:]
array([[0.49675483, 0.37832119, 0.59431287, ..., 0.16990737, 0.5396537 ,
        0.61913812],
       [0.97062498, 0.93776709, 0.81797714, ..., 0.96508877, 0.25208564,
        0.72982507],
       [0.87173234, 0.83127946, 0.91758202, ..., 0.50487542, 0.03052536,
        0.9625512 ],
       ...,
       [0.01884645, 0.33107071, 0.60018523, ..., 0.02268164, 0.46955907,
        0.37842628],
       [0.03405101, 0.77886243, 0.14856727, ..., 0.02484926, 0.03850398,
        0.39086524],
       [0.16567224, 0.1347261 , 0.48809697, ..., 0.55021249, 0.42324589,
        0.31440635]])

>>> client['long_table']
<DataFrameClient ['A', 'B', 'C']>

>>> client['long_table'].read()
              A         B         C
index
0      0.246920  0.493840  0.740759
1      0.326005  0.652009  0.978014
2      0.715418  1.430837  2.146255
3      0.425147  0.850294  1.275441
4      0.781036  1.562073  2.343109
...         ...       ...       ...
99995  0.515248  1.030495  1.545743
99996  0.639188  1.278376  1.917564
99997  0.269851  0.539702  0.809553
99998  0.566848  1.133695  1.700543
99999  0.101446  0.202892  0.304338

[100000 rows x 3 columns]

>>> client['long_table'].read(['A', 'B'])
              A         B
index
0      0.246920  0.493840
1      0.326005  0.652009
2      0.715418  1.430837
3      0.425147  0.850294
4      0.781036  1.562073
...         ...       ...
99995  0.515248  1.030495
99996  0.639188  1.278376
99997  0.269851  0.539702
99998  0.566848  1.133695
99999  0.101446  0.202892

使用互联网浏览器或命令行HTTP客户端,如curlhttpie,您可以选择下载整个数据或以高效分块的部分,格式由您选择。

# Download tabular data as CSV
https://127.0.0.1:8000/api/v1/table/full/long_table?format=csv

# or XLSX (Excel)
https://127.0.0.1:8000/api/v1/table/full/long_table?format=xslx

# and subselect columns.
https://127.0.0.1:8000/api/v1/table/full/long_table?format=xslx&field=A&field=B

# View or download (2D) array data as PNG
https://127.0.0.1:8000/api/v1/array/full/medium_image?format=png

# and slice regions of interest.
https://127.0.0.1:8000/api/v1/array/full/medium_image?format=png&slice=:50,100:200

基于网络的数据库访问通常涉及下载完整文件,例如Globus的方式;或者使用现代的基于块的数据存储格式,如在本地或云端存储中使用的TileDBZarr;或者使用针对特定大型数据集定制的解决方案。当只对图像堆栈的第一帧或表格的某列感兴趣时,等待整个文件的下载是浪费的,并且可能对大型纵向分析构成障碍。然而,将数据转换为适合块处理的格式或构建自定义的基于瓦片的访问解决方案并不总是实际可行的。(尽管如此,如果你能做这两件事中的任何一件,你应该考虑这样做!)

支持