BigTable является медленным, или действительно ли я являюсь немым?

Вы можете использовать пользовательский вид изображения, откуда вы можете получить границу, вот код. Вы также можете изменить ширину отступов и ширину обводки в соответствии с вашими потребностями. Это указать чуть ниже первой строки кода, спасибо

public class FreeCollage extends ImageView {

    private static final int PADDING = 8;
    private static final float STROKE_WIDTH = 5.0f;

    private Paint mBorderPaint;

    public FreeCollage(Context context) {
        this(context, null);
    }

    public FreeCollage(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        setPadding(PADDING, PADDING, PADDING, PADDING);
    }

    public FreeCollage(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initBorderPaint();
    }

    private void initBorderPaint() {
        mBorderPaint = new Paint();
        mBorderPaint.setAntiAlias(true);
        mBorderPaint.setStyle(Paint.Style.STROKE);
        mBorderPaint.setColor(Color.WHITE);
        mBorderPaint.setStrokeWidth(STROKE_WIDTH);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(PADDING, PADDING, getWidth() - PADDING, getHeight() - PADDING, mBorderPaint);
    }
}
27
задан Alex Bolotov 27 August 2009 в 21:43
поделиться

3 ответа

Could be a bit of both ;-)

If you're doing 400 queries on the Awards table, one for each result returned for a query on the mapping table, then I would expect that to be painful. The 1000-result limit on queries is there because BigTable thinks that returning 1000 results is at the limit of its ability to operate in a reasonable time. Based on the architecture, I'd expect the 400 queries to be way slower than the one query returning 400 results (400 log N vs. (log M) + 400).

The good news is that on GAE, memcaching a single hashtable containing all the awards and their points values is pretty straightforward (well, looked pretty straightforward when I cast an eye over the memcache docs a while back. I've not needed to do it yet).

Also, if you didn't already know, for result in query.fetch(1000) is way faster than for result in query, and you're restricted to 1000 results either way. The advantages of the latter are (1) it might be faster if you bail out early, and (2) if Google ever increases the limit beyond 1000, it gets the benefit without a code change.

You might also have problems when you delete a user (or an award). I found on one test that I could delete 300 objects inside the time limit. Those objects were more complex than your mapping objects, having 3 properties and 5 indices (including the implicit ones), whereas your mapping table probably only has 2 properties and 2 (implicit) indices. [Edit: just realised that I did this test before I knew that db.delete() can take a list, which is probably much faster].

BigTable does not necessarily do the things that relational databases are designed to do well. Instead, it distributes data well across many nodes. But almost all websites run fine with a bottleneck on a single db server, and hence don't strictly need the thing that BigTable does.

One other thing: if you're doing 400 datastore queries on a single http request, then you will find that you hit your datastore fixed quota well before you hit your request fixed quota. Of course if you're well within quotas, or if you're hitting something else first, then this might be irrelevant for your app. But the ratio between the two quotas is something like 8:1, and I take this as a hint what Google expects my data model to look like.

20
ответ дан 28 November 2019 в 05:26
поделиться

Google BigTable работает в распределенной файловой системе Google.

Данные распределяются. Может быть, 400 строк mysql по-прежнему лучше, но для больших данных Google BigTable может работать быстрее.

Я думаю, поэтому они рекомендуют нам использовать memcache, чтобы сделать это быстрее.

0
ответ дан 28 November 2019 в 05:26
поделиться

Моя модель данных неверна? Я делаю неправильный поиск?

Да и да, я боюсь.

Что касается вашей модели данных, то лучший способ справиться с этим - хранить сумму в записи пользователя и обновлять ее, когда пользователь получает / теряет награду. На самом деле нет никакого смысла подсчитывать их очки каждый раз, когда в подавляющем большинстве случаев он остается неизменным. Если вы сделаете тип сущности «UserAward» дочерней сущностью «User», вы можете обновить оценку и вставить или удалить запись UserAward в одной атомарной транзакции, гарантируя, что ваш счет всегда точен.

onebyone указывает, что вы можете сохранить в памяти таблицу наград. Это хорошая идея, но, учитывая ограниченный объем данных, еще лучше хранить их в локальной памяти. Глобальные члены сохраняются между HTTP-запросами, и поскольку я предполагаю, что вы не часто обновляете таблицу наград, вам не нужно сильно беспокоиться об аннулировании кеша. Просто загрузите его по первому запросу (или даже жестко закодируйте в свой источник). Если вы действительно измените список наград, развертывание нового незначительного обновления приведет к сбросу всех экземпляров, что приведет к их перезагрузке.

При поиске помните, что существенные затраты на выполнение операций с хранилищем - это время приема-передачи. Операция get (), которая ищет 1 или более записей по идентификатору (вы можете выполнять пакетную обработку!), Занимает около 20-40 мс. Однако запрос занимает около 160-200 мсек. Отсюда и сила денормализации.

помните, что существенные затраты на выполнение операций с хранилищем данных - это время приема-передачи. Операция get (), которая ищет 1 или более записей по идентификатору (вы можете выполнять пакетную обработку!), Занимает около 20-40 мс. Однако запрос занимает около 160-200 мсек. Отсюда и сила денормализации.

помните, что существенные затраты на выполнение операций с хранилищем данных - это время приема-передачи. Операция get (), которая ищет 1 или более записей по идентификатору (вы можете выполнять пакетную обработку!), Занимает около 20-40 мс. Однако запрос занимает около 160-200 мсек. Отсюда и сила денормализации.

19
ответ дан 28 November 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: