

# 将数据从 Amazon S3 导入到 DynamoDB 的最佳实践
<a name="S3DataImport.BestPractices"></a>

以下是将数据从 Amazon S3 导入到 DynamoDB 的最佳实践。

## 保持在 50000 个 S3 对象的限制以下
<a name="S3DataImport.BestPractices.S3Limit"></a>

每个导入作业最多支持 50000 个 S3 对象。如果您的数据集包含超过 50000 个对象，请考虑将它们合并为更大的对象。

## 避免过大的 S3 对象
<a name="S3DataImport.BestPractices.AvoidLargeObjects"></a>

S3 对象是并行导入的。如果有大量中型 S3 对象，可以执行并行导入，而不会产生过多的开销。对于 1 KB 以下的项目，可以考虑在每个 S3 对象中放入 400 万个项目。如果您的平均项目大小较大，则按比例在每个 S3 对象中放入较少的项目。

## 随机排列排序的数据
<a name="S3DataImport.BestPractices.RandomizeSortedData"></a>

如果 S3 对象按排序顺序保存数据，则它会创建*滚动热分区*。在这种情况下，一个分区接收所有活动，之后是下一个分区，依此类推。按排序顺序的数据定义为 S3 对象中的顺序项目，这些项目将在导入期间写入同一目标分区。数据按排序顺序的一种常见情况是 CSV 文件，其中项目按分区键排序，这样重复的项目可以共享同一个分区键。

为了避免出现滚动热分区，我们建议您在这些情况下随机排列顺序。这可以通过分散写入操作来提高性能。有关更多信息，请参阅 [在 DynamoDB 中的数据上传期间高效分配写入活动](bp-partition-key-data-upload.md)。

## 压缩数据以使 S3 对象的总大小保持在区域限制以下
<a name="S3DataImport.BestPractices.CompressData"></a>

在[从 S3 导入过程](S3DataImport.Requesting.md)中，对要导入的 S3 对象数据的总大小有限制。在 us-east-1、us-west-2 和 eu-west-1 区域中的限制是 15 TB，在所有其他区域中的限制是 1 TB。该限制基于原始 S3 对象的大小。

压缩功能可以实现在限制范围内导入更多原始数据。如果仅靠压缩不足以使导入量保持在限制范围内，您也可以联系 [AWS Premium Support](https://aws.amazon.com/premiumsupport/) 请求增加配额。

## 注意项目大小对性能的影响
<a name="S3DataImport.BestPractices.ItemSize"></a>

如果您的平均项目大小非常小（低于 200 字节），则相对于较大的项目大小，导入过程花费的时间可能要长一点。

## 在活跃导入期间请勿修改 S3 对象
<a name="S3DataImport.BestPractices.NoModification"></a>

当导入操作正在进行时，请确保源 S3 对象保持不变。如果在导入过程中修改了 S3 对象，则操作将失败，并显示错误代码 `ObjectModifiedInS3DuringImport` 和消息“The S3 object could not be imported because it was overwritten”。

如果您遇到此错误，请使用稳定版本的 S3 对象重新启动导入操作。为避免出现此问题，请等待当前导入完成，然后再对源文件进行更改。

## 考虑在没有任何全局二级索引的情况下导入
<a name="S3DataImport.BestPractices.GSI"></a>

导入任务的持续时间可能取决于是否存在一个或多个全局二级索引 (GSI)。如果您计划使用基数低的分区键创建索引，则如果将索引创建推迟到导入任务完成之后（而不是将其包含在导入任务中），则导入速度可能会更快。

**注意**  
创建 GSI 不会产生写入费用，无论是在导入期间还是导入之后创建。