从一个巨大的(> 200MB)数组文件中加载随机对象而不加载整个数组

Posted

技术标签:

【中文标题】从一个巨大的(> 200MB)数组文件中加载随机对象而不加载整个数组【英文标题】:Loading random objects from a huge (>200MB) array file without loading the entire array 【发布时间】:2018-11-15 12:23:58 【问题描述】:

我正在构建一个静态 Angular 网站,其数据基于一个包含超过 200,000 个 JSON 对象的巨大数组中的 1000 个随机对象。我正在在线某处(如 Github 或 Dropbox)以文本形式存储大量 JSON 对象,并且文本文件大小大于 200MB。由于性能问题,显然不能加载网站中的所有数据,但我也不想使用数据库,因为我正在构建静态网站。如何只随机加载 200,000 个对象中的 1000 个对象而不加载整个数组?

【问题讨论】:

许多静态站点使用基于云的数据库或数据存储。你的方法不实用 如果没有一些服务器端程序,这似乎是不可能的。这正是 HTTP 的工作方式。 JSON 是一种序列化格式,。它没有随机访问的概念。最好将这个 JSON 分成多个较小的 JSON 文件。 自己在 JS 中为 json 编写一个解析器(或在网上找到一个)并使其(按照它的方式)仅将元素 x-through-y 保留在根数组中。它将下载所有 json(作为文本,这就是 http 的方式),但不会加载它们(作为对象)。没有服务器端代码,这是唯一的方法(显然服务器端执行是做你想做的事情的方法。但我想说没有什么是不可能 @Hashbrown It will download all the json (as text, thats just how http be) 实际上 HTTP 可以做范围,这取决于 JSON 的格式,虽然锚定到逻辑开始/结束进行解码可能有点棘手.. 【参考方案1】:

您可以尝试仅下载文件的第一部分并尝试使用它。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests

您将使用 Angular 的 HTTP 服务发出 GET 请求,但会将 Range: bytes=0-1023 添加到标头中。其中0-1023 定义了您想要获取的字节数(使用开始和结束范围)。

如果服务器支持此功能,那么您必须清理从服务器获取的字符串 JSON。因为 JSON 会在它完成之前被截断。

我不知道 JSON 的结构是什么。很难说这是否是一个实用的解决方案,但如果它是一个 JSON 对象数组。您可以尝试查找以数组分隔符 , 字符结尾的字节范围,然后将 ] 附加到字符串的末尾。

如果您需要文件的随机部分。您将对不同的部分块发出多个 GET 请求,然后尝试清理 JSON 以使其有效。

【讨论】:

我尝试了你的方法,它似乎只在范围从 0 开始时才有效,并且当我输入例如 bytes=1-1023 时它给了我一个错误。我在这里针对这个特定问题提出一个新问题:***.com/questions/50750110/…。

以上是关于从一个巨大的(> 200MB)数组文件中加载随机对象而不加载整个数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MATLAB 中加载大文件(~150MB)?

Python Numpy数组的读入存储操作

在 pytorch 中加载多个 .npy 文件(大小 > 10GB)

如何从文件中加载二维字符数组并使用 ncurses.h 在 C 中使用 mvprintw() 打印它?

pandas 是不是读取完整的数据文件并将其存储在数据框中?在 pandas 中加载 100mb 文件是不是有效?

从数组中加载列表