【发布时间】:2019-03-18 15:55:28
【问题描述】:
我是 Google Cloud Platform 的新手。我正在尝试逐行读取 Google Cloud Storage(通过服务帐户密钥访问的非公共存储桶)中存在的 CSV 文件,大小约为 1GB。
我找不到任何选项来逐行读取 Google Cloud Storage (GCS) 中的文件。我只看到按块大小/字节大小选项读取。由于我正在尝试读取 CSV,因此我不想使用按块大小读取,因为它可能会在读取时拆分记录。
目前尝试的解决方案: 尝试将 GCS 中存在的 CSV 文件中的内容复制到临时本地文件并使用以下代码读取临时文件。下面的代码按预期工作,但我不想将大文件复制到我的本地实例。相反,我想从 GCS 中逐行读取。
StorageOptions options =
StorageOptions.newBuilder().setProjectId(GCP_PROJECT_ID)
.setCredentials(gcsConfig.getCredentials()).build();
Storage storage = options.getService();
Blob blob = storage.get(BUCKET_NAME, FILE_NAME);
ReadChannel readChannel = blob.reader();
FileOutputStream fileOuputStream = new FileOutputStream(TEMP_FILE_NAME);
fileOuputStream.getChannel().transferFrom(readChannel, 0, Long.MAX_VALUE);
fileOuputStream.close();
请提出方法。
【问题讨论】:
-
ReadChannel 是 ReadableByteChannel 的子类,您可以将其包装在 Reader 中,如 dup 所示。
-
@DougStevenson 我正在批处理中读取文件。我的文件将有 1000 万条记录,我不想一次读取所有行并让我的 JVM 崩溃
-
我明白了。使用副本中的建议。您可以安排从 BufferedReader 单独接收行。您不必一次全部处理。
-
A FileChannel 和 ReadChannel 共享一个公共超类 ReadableByteChannel,这是您正在寻找的 API。它应该以同样的方式工作。
标签: google-cloud-platform google-cloud-storage nio