为什么我存储在 Couchdb 中的非常大的字符串会发生变化?
Why is the very large string that I am storing in Couchdb getting changed?
我在 couchdb 中存储了一个非常大的字符串(大约几百万个字符)。但是当我稍后通过视图获取字符串时,它与原始字符串不同。是否有一些截断正在进行?允许的最大字符串大小是多少?该字符串包含视频数据,是 blob 以 base64 编码的结果。任何想法,将不胜感激。谢谢。
有点奇怪,字符串不知何故变成了你的话中的 "not the same as the original"。有一个 max_document_size 的配置选项,您可能 运行 进入,但我希望超过该选项会导致您的文档修订被直接拒绝。也许您发现了一个错误,或者您的代码路径中有更多导致突变的错误。
但要切中要点,正确的解决方案是正如您 OP 的评论者所建议的那样:[至少] 对此类数据使用二进制附件!
您的文档的 JSON(正文)部分可能会在通过系统时完全加载到内存中,特别是当它进入任何 JS 视图代码时,因此请保持它相当小(几 KB甚至 MB 也可能没问题,具体取决于您有多少 RAM。
附件可能会以更一致的流式传输方式处理(我推测),但如果您打算复制任何大于平均网络中断频率的内容,仍然可能会给您带来麻烦。许多 MB 可能适合附件,但对于 GB 大小的附件,您可能只想将它们存储在数据库之外(例如,在您的文件系统上的文件夹中),然后 backup/sync 以其他方式存储它们,就像您通常会被鼓励的那样处理其他系统中任何类型的文件类数据。
我最终意识到问题出在我的编码器上,而不是 couchdb。以下是我的问题所在的相关详细信息和代码,以防其他人遇到问题。
我正在使用 whammy 库进行一些视频编辑,然后将其转换为 webm。该库输出一个 blob,我想将其存储在我的数据库中并在以后访问。我看到你可以把它转换成Base64,然后用下面的代码把它发送到服务器:
var blobToBase64 = function(blob, cb) {
var reader = new FileReader();
reader.readAsDataURL(blob);
reader.onload = function() {
var dataUrl = reader.result;
var base64 = dataUrl.split(',')[1];
cb(base64);
};
};
我的问题是函数后有 `reader.readAsDataURL(blob)'。我不确定为什么这会产生如此大的不同。
我将此函数的输出发送到我的服务器并将其存储在 couchdb 中(目前仍作为 JSON 中的一个字段而不是附件)。
检索后,我使用以下函数将 Base64 转换回 blob:
function base64ToBlob(b64Data, contentType, sliceSize) {
contentType = contentType || 'video/webm';
sliceSize = sliceSize || 512;
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
var blob = new Blob(byteArrays, {type: contentType});
return blob;
}