我有一个关于indexedDB
和Dexie.js
库的问题,用于恢复和备份数据库及其性能改进。让我们设想一下,我们至少有一个2 GB的数据库(用于离线Map数据),并且它们具有(按键、value)结构,其中Key可以是字符串,值可以是blob(图像或二进制矢量数据)。因此,在我的场景中,用户选择一个数据库,我的Web应用程序应该开始下载该数据库以供离线访问。那么,在这种情况下,您认为什么方法能给我带来最佳性能呢?由于我必须下载备份并恢复它们,对于2GB和几百万条记录来说,这可能是一个性能挑战。我以前对sqlite数据库做过类似的事情,但我只需要下载数据库文件并连接到它。这里我必须在下载后恢复indexedDB,这似乎是有问题的。所以我可以把我的问题分解成几个子问题:
首先,我首先如何创建这些数据库?
然后,如何恢复这些备份?有没有高性能的方法?
关键数据类型(String或Integer)是否会影响IndexedDB的性能?
1条答案
按热度按时间ulmd4ohb1#
我不知道你说的“恢复”是什么意思,但我想你的意思是把数据导入到IndexedDB中?或者你的意思是IndexedDB是把数据放回另一个数据库的备份和“恢复”?
我的回答的其余部分基于这样的假设:“restore”是将数据导入indexeddb。
要了解系统在添加数百万个键/值时的性能,唯一的方法是我建议您以1000行为单位导入行,并为每个导入的行显示一个进度条。()或bulkPut()方法来汇入每个区块。请确保不要在单个事务中执行整个导入,因为这可能会使系统陷入饥饿状态,并使indexeddb阻塞太长时间。方法,每个块至少使用一个事务(这也很重要-每1000条记录一个事务可能就可以了-但是如果您对此进行测试,请尝试不同的块大小以找到最佳速度!)。
也不知道用户在等待时间方面的预期。它可以在后台执行,而用户可以在在线模式下使用您的应用程序吗?如果是这样,用户可能会接受更长的导入时间比如果用户将不得不等待整个数据导入。
你还需要查看StorageManager API并请求你的用户允许你存储大量的持久数据。你也可以阅读关于in dexie docs的页面。
您可能需要一个后台工作线程来获取数据并执行批量操作-创建一个服务工作线程来执行此工作。您可以使用response.blob()并将其传递给dexie-export-import。您也可以尝试使用ReadableStream api来下载数据块。让一个工作线程执行此下载和导入操作将执行得更快,并且在导入时不会影响应用程序的性能。
Dexie-export-import几乎完全按照我在这里建议的那样--将行以块的形式导入indexeddb,但是如果使用它,您需要让您的服务端点发送与dexie-export-import兼容的JSON,其中blob是Baset 64编码的。但是由于您的数据只是键和blob,您可以从拥有自己的二进制格式中受益,并且无需此插件就可以自己执行bulkAdd()。
关于你的最后一个问题:据我所知,使用数字或字符串作为键并没有太大区别。长字符串会比较慢,但短字符串的性能可能与数字相同(如果这不是真的,请纠正我!)。您需要测试才能真正了解。
如果你将执行一些测试,请让我知道你的结果;)