8

JavaScript 进程会生成大量数据 (200-300MB)。我想保存这些数据以供进一步分析,但到目前为止我发现的最好的方法是使用这个示例http://jsfiddle.net/c2U2T/保存,这对我来说不是一个选项,因为它看起来需要所有数据在开始下载之前可用。但我需要的是类似

var saver = new Saver();
saver.save(); // The Save As ... dialog appears
saver.onaccepted = function () { // user accepted saving
    for (var i = 0; i < 1000000; i++) {
        saver.write(Math.random());
    }
};

当然,而不是 Math.random() 将是一些有意义的构造。

4

2 回答 2

1

您实际上正在尝试做的是一种流式传输。我的意思是 FileAPI 不适合这项任务。相反,我可以建议两个选项:

首先,使用 XHR 工具,即 ajax,通过将您的数据分成几个块,这些块将按顺序发送到服务器,每个块在其自己的请求中连同一个 id(用于标识流)和一个位置索引(用于标识块位置)。我不建议这样做,因为它增加了分解和重新组合数据的工作,而且还有更好的解决方案。

实现此目的的第二种方法是使用 Websocket API。它允许您在生成数据时按顺序将数据发送到服务器。遵循通常的流 API。我想你肯定需要这个。

这个页面可能是一个很好的起点:http ://binaryjs.com/

这就是所有的人!

编辑考虑您的评论:

不过,我不确定是否完全理解您的观点,但是 HTML5 的 FileSystem API 呢?

这里有几个示例:http: //www.html5rocks.com/en/tutorials/file/filesystem/其中允许您将数据附加到现有文件的示例。您还可以创建一个新文件等:

function onInitFs(fs) {

  fs.root.getFile('log.txt', {create: false}, function(fileEntry) {

    // Create a FileWriter object for our FileEntry (log.txt).
    fileEntry.createWriter(function(fileWriter) {

      fileWriter.seek(fileWriter.length); // Start write position at EOF.

      // Create a new Blob and write it to log.txt.
      var blob = new Blob(['Hello World'], {type: 'text/plain'});

      fileWriter.write(blob);

    }, errorHandler);

  }, errorHandler);

}

编辑 2:

如 SO here上所说,您尝试使用 javascript 是不可能的。尽管如此,作者还是建议使用 Java Applet 来实现所需的行为。

简而言之,HTML5 Filesystem API 只提供了一个沙盒文件系统,即位于浏览器的某个隐藏目录中。因此,如果您想访问真正的文件系统,考虑到您的用例,使用 java 就可以了。我猜这里有 java 和 javascript 之间的接口。但是,如果您想让您的数据仅可从浏览器访问(受同源策略约束),请使用 FileSystem API。

于 2013-05-13T13:51:22.263 回答
1

@dader - 我会以dader的例子为基础。

  1. 使用 HTML5 FileSystem API - 但不是每行都写入文件(IO 超过其价值),您可以在 javascript 对象/数组/字符串中批量处理内存中的一些行,然后仅将其写入文件当他们达到某个阈值时。因此,随着进程突突,您将附加到本地文件(使暂停/重新启动/停止等变得容易)
  2. 值得注意的是以下内容,这是一个示例,说明如何生成对话以请求您需要的数据量(听起来很大)。用铬测试过:

    navigator.persistentStorage.queryUsageAndQuota(
    function (usage, quota) {
      var availableSpace = quota - usage;
      var requestingQuota = args.size + usage;
      if (availableSpace >= args.size) {
        window.requestFileSystem(PERSISTENT, availableSpace, persistentStorageGranted, persistentStorageDenied);
      } else {
        navigator.persistentStorage.requestQuota(
            requestingQuota, function (grantedQuota) {
              window.requestFileSystem(PERSISTENT, grantedQuota - usage, persistentStorageGranted, persistentStorageDenied);
            }, errorCb
          );
      }
    }, errorCb);
    
  3. 完成后,您可以使用 Javascript 打开一个新窗口,其中包含您保存的 blob 对象的 url,您可以通过以下方式检索:fileEntry.toURL()

  4. 或者 - 完成处理后,您可以在 html 链接中显示该 URL,然后他们可以右键单击它并执行任何他们想要的“将链接另存为”。

但这是一种新奇酷炫的东西,您可以完全在浏览器中完成,而无需以任何方式涉及服务器。旁注,由 Javascript 进程生成的 200-300MB 数据听起来绝对是巨大的......这将是您是否存储“正确”数据的一个问题......

于 2013-06-10T20:37:43.203 回答