ミニ CRM であるアプリケーションがあります。ユーザーの一括インポートを可能にする機能を追加しようとしています。アップロード ハンドラは CSV ファイルからデータを読み取り、CustomerService クラスを呼び出して Customer オブジェクトをデータストアに保存します。
public int createCustomers(final List<Customer> customers) {
List<List<Customer>> buckets = bucketList(customers);
int bucketCount = 0;
PersistenceManager persistenceManager = PMF.get().getPersistenceManager();
for(List<Customer> bucket: buckets) {
Collection<Customer> makePersistentAll = persistenceManager.makePersistentAll(bucket);
}
return customers.size();
}
bucketList メソッドは、大きなリストを小さなリストに分割するだけです。これは、アプリケーションを調整して、makePersistentAll 呼び出しに最適なサイズがあるかどうかを確認するために行いました。現在、1000 に設定しており、100,000 レコードを含む CSV ファイルでテストしています。アプリケーションは、レコードが追加されるにつれて、特に 60K レコード マーク付近でますます遅くなるようです。Customer のすべてのフィールドをインデックスなしに設定しようとしましたが、顕著な違いはないようです:
@PersistenceCapable
public class Customer implements Serializable {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent
private String accountNumber;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent
private String email;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent
private String firstName;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent
private String lastName;
...
これを開発 (ローカル) と本番の App Engine でテストしましたが、役に立ちませんでした。これは、大量のデータをシステムにインポートし、データストアにすばやく保存する、やや一般的な使用例だと思います。これを機能させるために、いくつかのことを試しました: - AsyncDatastoreService を使用する - 顧客オブジェクトを 1 つずつ保存する (makePersistent) - Customer の Key オブジェクトを主キーとして使用する - accountNumber 文字列を主キーとして使用する
しかし、大きな違いはないようです。