1

地理空間クエリで MongoDB のパフォーマンスをテストするために、小さな Java アプリケーション (Spring Data を使用) を作成しました。

public class MongoThread {

public static void main(String[] args) throws Exception {

    if(args.length != 1) {
        System.out.println("Usage: MongoThread <nb_thread>");
        System.exit(0);
    }

    int nbThread = Integer.parseInt(args[0]);

    ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringMongoConfigStandalone.class);
    MongoOperations db = (MongoOperations) ctx.getBean("mongoTemplate");

    for (int x=0; x<nbThread; x++) {
        double lat = Math.random() * 60;
        double lng = Math.random() * 60;
        double radius = 3000 + 50 * Math.random();
        MyThread t = new MyThread("Thread #" + x, db, lat, lng, radius);
        t.start();
    }

    //create1MEntries(db);
}

private static void create1MEntries(MongoOperations db) {
    if (!db.getCollectionNames().contains("Item")) {
        db.createCollection("Item");
    }
    db.indexOps(Item.class).ensureIndex(new GeospatialIndex("loc"));
    for(int i=0; i<1000000; i++) {
        Item item = new Item();
        item.setName("item" + i);
        item.setLoc(new double[]{Math.random() * 180, Math.random() * 180});
        db.save(item, "Item");
    }
}
}

class MyThread extends Thread {

String name;
MongoOperations db;
double lat, lng, radius;

public MonThread (String name, MongoOperations db, double lat, double lng, double radius) {
    this.name = name;
    this.db = db;
    this.lat = lat;
    this.lng = lng;
    this.radius = radius;
}

public void run() {
    long t1 = Calendar.getInstance().getTimeInMillis();
    List<Item> items = db.find(new Query(Criteria.where("loc")
            .near(new Point(lat,lng)).maxDistance(radius/111.12)).limit(100), Item.class, "Item");
    System.out.println(name + " - " + items.size() + " results found around " + radius + " of (" + lat + "," + lng + ")");
    long t2 = Calendar.getInstance().getTimeInMillis();
    System.out.println(name + " - " + (t2-t1) + "ms");
}
}

public class Item {
    @Id
    private String id;
    private String name;
    private double[] loc;
}

テストを複数回実行してメモリにデータをロードした後、得られた結果は次のとおりです。

  • 私の開発用コンピューター (Win7 64 ビット、i7 860 @2.8 Ghz、RAM 8GB 1066Mhz): 100 スレッドの場合、約 500 ミリ秒 (450 ミリ秒から 550 ミリ秒) ですべての応答を取得します。

  • 私のサーバー (OVH でホスト: Debian 6.0 64 ビット、i3 2130 2x2(HT) 3.4GHz、RAM 16GB 1333Mhz): 100 スレッドの場合、約 1700 ミリ秒 (1600 ミリ秒と 1900 ミリ秒の間) ですべての応答を取得します。

私はハードウェアや Linux のスペシャリストではありませんが、このサーバーが私の Windows コンピューターよりも優れている (または少なくとも同等である) ことを期待していました。いくつかのフォーラムで、MongoDB は Linux 上で非常に高速であり、重要なハードウェア機能は (この順序で) RAM、CPU (ただし、Mongo は複数のコアを使用しません)、およびハード ドライブであると読みました。

MongoDBの速度が低下する可能性があることを読んだため、開いているファイルの最大数を増やしました(ulimit -n 99999を使用)が、結果には影響しませんでした。

ボトルネックがどこから来るのか考えていますか?

4

1 に答える 1

4

これは Linux と Windows の問題ではないと思います。つまり、i3 プロセッサは、i7 が Windows マシンに搭載されている獣に比べてかなりローエンドです。

2 つのオペレーティング システムのパフォーマンスを本当に比較したい場合は、同じハードウェアでセットアップを実行することをお勧めします。

于 2012-11-25T20:23:59.833 に答える