самый быстрый способ получить процесс и загрузить 42 миллиона строк

У меня есть база данных, которая связывает диапазоны IP-адресов с идентификатором местоположения в другой таблице. Он такой большой, что мы пытаемся найти новое решение с помощью aerospike.

Решение, которое мы придумали, состоит в том, чтобы использовать интервалы. Что-то вроде этого:

Ключ: 1000000 (int64 IP-адреса) Bin1: по умолчанию: 1 (идентификатор местоположения для начала данного блока)

Bin2: 1234567:2 (первый IP-адрес в блоке, где изменяется идентификатор местоположения): (идентификатор местоположения)

Bin3: 1345678:3 (второй IP-адрес в блоке, где изменяется идентификатор местоположения): (идентификатор местоположения)

так далее

Используя этот метод, мы могли бы математически получить идентификатор местоположения из IP-адреса, сократив при этом количество строк и время обработки сервером.

Я хочу провести несколько тестов на моей идее, но у меня возникла проблема с преобразованием нашей текущей системы.

У нас есть база данных с диапазонами (например, 0-160000) со связанным идентификатором местоположения.

Таблица диапазонов имеет 9 297 631 строку.

Скрипт С#, который я сделал, выполняет этот sql:

SELECT * FROM dbo.GeoIPRanges 
where (startIpNum BETWEEN 300000000 AND 300000100)
OR (endIpNum BETWEEN 300000000 AND 300000100)
OR (startIpNum <= 300000000 AND endIpNum >= 300000100)

Это занимает около 4 секунд на звонок. Приведенные выше цифры являются примерными. Вы можете видеть, что они находятся в блоках по 100. Максимальное количество IP-адресов составляет 4 294 967 295. Делая это блоками по 100, я получаю 42 949 672 вызова примерно по 4 секунды каждый. что занимает очень много времени. Время обработки, необходимое для форматирования информации в форме, которую я хочу для aerospike, незначительно.

Зная всю эту информацию, есть ли идеи, как это ускорить.


person Mr. MonoChrome    schedule 24.04.2014    source источник
comment
Вы перемещаете данные на новый сервер или просто изменяете данные в таблицах, которые вам нужны для работы с Aerospike?   -  person Siyual    schedule 24.04.2014
comment
сохранение старых данных, перенос обработанных данных в aerospike на новый сервер   -  person Mr. MonoChrome    schedule 24.04.2014
comment
Рассматривали ли вы возможность использования SSIS для обработки и передачи данных между серверами?   -  person Siyual    schedule 24.04.2014
comment
Поищу, не знаю поможет или не поможет.   -  person Mr. MonoChrome    schedule 24.04.2014
comment
Если вы еще не подумали об этом, я бы порекомендовал использовать SSIS для обработки миграции и дополнения данных одним махом. Я уверен, что у других могут быть другие предпочтительные методы, но я выполнял очень похожие миграции/загрузки/манипулирование данными через SSIS, и это всегда было очень эффективно.   -  person Siyual    schedule 24.04.2014


Ответы (2)


Существует инструмент Aerospike-loader. Если вы можете сбросить свои данные в формате файла csv, загрузчик может загрузить данные в aerospike. Он может параллельно читать несколько файлов CSV и параллельно загружать данные в aerospike. Во внутренних тестах на приличном оборудовании мы могли загружать до 200 000 записей в секунду. Подробнее читайте в документах и ​​примерах.

person sunil    schedule 06.05.2014
comment
хотя я ускорил свою программу, и теперь она в рабочем состоянии, это ценный ответ для сообщества, поэтому я отметил его как ответ и дал ему +1 - person Mr. MonoChrome; 06.05.2014

Это может быть не то, что вы думаете, но только вчера я использовал R для извлечения некоторых наборов данных из SQL Server, и это оказалось НА ВЕЛИЧИНЫ быстрее, чем сам SQL Server. Проведите небольшое исследование этой методологии, а затем попробуйте что-то вроде этого...

library(XLConnect)
library(dplyr)
library(RODBC)

dbhandle <- odbcDriverConnect('driver={SQL Server};server=Server_Name;database=DB_Name;trusted_connection=true')

NEEDDATE <- as.Date('8/20/2017',format='%m/%d/%Y')

# DataSet1
DataSet1<-paste("DECLARE @NEEDDATE nvarchar(25)
SET @NEEDDATE = '2017-07-20'

SELECT      . . .

        )")


DataSet1 <- sqlQuery(dbhandle, DataSet1)
DataSet2 <- sqlQuery(dbhandle, DataSet2)

Combined <- rbind(DataSet1, DataSet2)



ExcelFile <- loadWorkbook("C:/Test/Excel_File.xlsx")


Sheet1=tbl_df(readWorksheet(ExcelFile,sheet="Sheet1"))
Sheet2=tbl_df(readWorksheet(ExcelFile,sheet="Sheet2"))


write.csv(DataSet1, paste0("C:/Test/Output_", NEEDDATE, ".csv"), row.names = FALSE)
person ASH    schedule 23.09.2017