【问题标题】:Optimal document uploading to CloudSearch from built objects从构建对象上传到 CloudSearch 的最佳文档
【发布时间】:2016-03-09 23:05:31
【问题描述】:

我正在对 JSON 响应进行一些处理,并希望将结果数据上传到 cloudsearch。我可以一次完成一份文件:

const AWS = require("aws-sdk");
const JSONStream = require("JSONStream");
const jsonStream = JSONStream.parse("*");
const csd = AWS.CloudSearchDomain(config);

jsonStream.on("data", processData);

request.get(resultUrl).pipe(jsonStream);

function processData(data) {
  data = doProcessData(data);

  /*
   * `data` is now a JSON object ready to be uploaded to CloudSearch
   * e.g. {type: "add", id: "random-id", fields: {field: "a"}}
   */

  csd.uploadDocuments({contentType: "application/json", documents: [data]});
}

这可行,但AWS suggests:

为了获得最佳的上传性能,请将接近最大批量大小的批量添加和删除操作分组

我在想我可以将文档写入文件并检查文件大小并在文件大约为 3MB 时上传文档。我可以接近 5MB,但我不想超过批量大小:

/* Please ignore semantic errors */
filename = "/tmp/foo.json";
file = fs.createWriteStream(filename);
file.write("[");
// in `processData`
  file.write(JSON.stringify(data));

  const stats = file.stat(filename);
  if (stats.size > 3000000) {
    file.write("]");
    csd.uploadDocuments({documents: fs.createReadStream(filename)});
    fs.trunate(filename);
  }
  else {
    file.write(",");
  }

这种方法没问题,但如果有更好的方法来确定文件是否已准备好上传,那就太好了。如果可以的话,我也希望避免使用文件系统。

我也可以通过以下方式在内存中执行此操作:

  const stringifier = JSONStream.stringify("[", ",", "]");
  // in `processData`
    csd.uploadDocuments({documents: stringifier});
    stringifier.write(data);

但是,批处理大小可能会超过 5MB。我也不确定如何检查已写入 JSON 流的内容。

有没有将派生文档写入 CloudSearch 的好方法?如果做不到这一点,是否有一种简单的方法可以检查已将多少空间写入流,甚至变量正在使用多少空间?

【问题讨论】:

    标签: javascript node.js amazon-web-services stream amazon-cloudsearch


    【解决方案1】:

    这只是我用于下载大文件、获取大小和处理大小的概念。读取循环期间的计数将是流的每个字节 [1024] 块。

    @Override
    protected String doInBackground(String... f_url) {
        try {
            int count;
            File directory = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(), "/");
            if (!directory.exists()) {
                if (!directory.mkdirs()) {
                    throw new Exception("Could not create directory?!?!?");
                }
            }
            String filePath = Environment.getExternalStorageDirectory().getAbsoluteFile() + "/ItemLocalStorage.db";
            URL url = new URL(f_url[0]);
            URLConnection urlConnection = url.openConnection();
            urlConnection.connect();
            int contentLength = urlConnection.getContentLength();
            InputStream input = new BufferedInputStream(url.openStream(), 8192);
            OutputStream output = new FileOutputStream(filePath);
            byte data[] = new byte[1024];
            int byt = 0;
            int mb = 0;
            int mbLength;
            while ((count = input.read(data)) != -1) {
                if (!isCancelled()) {
                    byt += count;
                    mb = ((byt/1024)/1024
                    mbLength = ((contentLength / 1024) / 1024);
                    output.write(data, 0, count);
                }
            }
            if (isCancelled()) {
                output.write(0);
            }
            output.flush();
            output.close();
            input.close();
            return filePath;
        } catch (Exception e) {
            Log.e("Error: ", e.getMessage());
            return null;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多