Вы можете попробовать следующее. По сути, вы фильтруете первый массив на основе того, существует ли идентификатор во втором массиве, а затем отображаете его обратно, выбирая только те ключи, которые вы хотите.
var resultArray = array1.filter(function(arr) {
return array2.indexOf(arr.id) !== -1;
}).map(function(item) {
return {
name: item.name
};
});
Мы занимались этим в том месте, где я работал в прошлом году, поэтому все лето. Мы не требовали особой детализации информации, поэтому для нас хорошо работало объединение данных за разные периоды времени. Например, у нас будет статистика за один день в реальном времени, после чего она будет помещена в некоторые ежедневные суммы, а затем выведена в ежемесячную таблицу.
Это, очевидно, имеет ряд огромных недостатков, а именно потерю зернистость. Мы рассмотрели много разных подходов в то время. Например, как вы сказали, CSV или другой подобный формат потенциально может служить способом обработки месячных данных за раз. Большая проблема - вставки однако.
Начните с установки некоторой примерной схемы с точки зрения ТОЧНОЙ информации, которую вам нужно хранить, и при этом вы ' Я буду руководствоваться (через изменения) тем, что будет работать для вас.
Еще одно замечание для огромного количества вставок: мы потенциально обсуждали идею сброса статистики в реальном времени в маленького демона, который будет служить для хранения данных за несколько часов, а затем не в режиме реального времени, и вставлять их в базу данных. до следующего часа. Просто мысль.
For the kind of activity you're looking at, you need to look at the problem from a new point of view: decoupling. That is, you need to figure out how to decouple the data-recording steps so that delays and problems don't propogate back up the line.
You have the right idea in logging hits to a database table, insofar as that guarantees in-order, non-contended access. This is something the database provides. Unfortunately, it comes at a price, one of which is that the database completes the INSERT
before getting back to you. Thus the recording of the hit is coupled with the invocation of the hit. Any delay in recording the hit will slow the invocation.
MySQL offers a way to decouple that; it's called INSERT DELAYED
. In effect, you tell the database "insert this row, but I can't stick around while you do it" and the database says "okay, I got your row, I'll insert it when I have a minute". It is conceivable that this reduces locking issues because it lets one thread in MySQL do the insert, not whichever you connect to. Unfortuantely, it only works with MyISAM tables.
Another solution, which is a more general solution to the problem, is to have a logging daemon that accepts your logging information and just en-queues it to wherever it has to go. The trick to making this fast is the en-queueing step. This the sort of solution syslogd would provide.
По моему мнению, хорошо бы придерживаться MySQL для регистрации посещений, потому что он предоставляет инструменты для анализа ваших данных , Чтобы уменьшить нагрузку, у меня были бы следующие предложения:
Это дает вам меньший удар по производительности для ведения журнала и хорошо проиндексированную нормализованную структуру для запросов / анализа.
Если предположить, что ваш сервер MySQL находится на другой физической машине, чем ваш веб-сервер, то да, возможно, это будет немного более эффективно регистрировать попадание в файл в локальной файловой системе, а затем периодически помещать их в базу данных.
Это добавило бы некоторую сложность. Вы проверяли или рассматривали тестирование с регулярными запросами? Т.е. увеличить счетчик с помощью запроса UPDATE (потому что вам не нужна каждая запись в отдельной строке). Вы можете обнаружить, что это не так сильно тормозит, как вы думали, хотя, очевидно, если вы запускаете 80 000 000 просмотров страниц в день, у вас, вероятно, совсем не будет места для маневра.
I think that using MySQL is an overkill for the task of collecting the logs and summarizing them. I'd stick to plain log files in your case. It does not provide the full power of relational database management but it's quite enough to generate summaries. A simple lock-append-unlock file operation on a modern OS is seamless and instant. On the contrary, using MySQL for the same simple operation loads the CPU and may lead to swapping and other hell of scalability.
Mind the storage as well. With plain text file you'll be able to store years of logs of a highly loaded website taking into account current HDD price/capacity ratio and compressability of plain text logs
Вы должны быть в состоянии получить такой объем довольно легко, при условии, что вы делаете некоторые вещи разумно. Вот несколько идей.
Я не собираюсь более подробно объяснять что-либо из вышеперечисленного, так как если у вас в команде есть навыки разработчика, чтобы в любом случае создать приложение такого масштаба, вы либо будете знать, что это значит, либо сможете это выяснить.
При условии, что у вас не слишком много индексов, 1000 строк в секунду не являются нереалистичными при ваших размерах данных на современном оборудовании; иногда мы их вставляем (и, вероятно, имеем гораздо больше индексов).
Не забудьте протестировать производительность на оборудовании производственной спецификации (мне не нужно вам об этом говорить, верно?).
1000 строк в секунду - это нереально с вашими размерами данных на современном оборудовании; иногда мы их вставляем (и, вероятно, имеем гораздо больше индексов).Не забудьте протестировать производительность на оборудовании производственной спецификации (мне не нужно вам об этом говорить, верно?).
1000 строк в секунду - это нереально с вашими размерами данных на современном оборудовании; иногда мы их вставляем (и, вероятно, имеем гораздо больше индексов).Не забудьте протестировать производительность на оборудовании производственной спецификации (мне не нужно вам об этом говорить, верно?).