2016-02-18 2 views
0

Для разбиения RDF на три объекта по теме я использую String.hashCode() объекта и помещаю тройку в соответствующий раздел. Цель состоит в том, чтобы иметь возможность обрабатывать секционированные файлы в памяти (обработка большого файла может быть невозможна).Как разделить RDF-тройки в Java на основе темы

Теперь, чтобы иметь ограниченное количество разделов, я делаю следующее. Если предположить, что мы хотим иметь 10 разделов, из большого RDF файла:

String subject; 
    partitionFileName = subject.hashCode/(Integer.MAX_VALUE/10) 

Поэтому все тройки с теми же субъектами будут в одном разделе и в целом мы будем иметь 10 разделов.

Теперь проблема в том, что, когда тройки имеют разные распределения, это может привести к очень большим или очень небольшим разделам, которые нежелательны.

Есть ли у кого-нибудь предложения?

Заранее спасибо.

+0

'subject.hashCode()% 10'? – Kenney

+0

Ответ на Эзотерику велик, но вот хорошее чтение: https: // github.com/gholt/ring/blob/master/BASIC_HASH_RING.md – Michael

ответ

3

Алгоритм:

  • Создать раздел для каждого предмета (это может быть сделано на лету во время обработки RDF)
  • Для каждой тройки, присвоить его раздел в соответствии с предметом и memoize тему отображение -разбиение
  • в то время как количество разделов> 10, объединить два самых маленьких разделов и обновить карту

Pros:

  • Обеспечивает все троек с той же теме в том же разделе
  • Сбалансированный, пока ваши данные не очень однобоко
  • Вы не должны использовать хэш-код, если вы не хотите

Против:

  • дополнительного времени обработки, хотя и не обременительная сумма; это O (n * m), где n - число троек, а m - количество отдельных объектов.
  • Различия в размерах разделов, в том же разделе
  • вы должны поддерживать отображение для выполнения поиска против, но это в конечном счете, тривиально сделать и постоянное время работы

Если вы не заботитесь о сохранении же объект съемки троек в пределах единый раздел, затем просто создайте десять ведер и заполните их круговым движением. O (n) и как можно более сбалансированным.

+2

Отлично. И наоборот, если вы не заботитесь о количестве разделов, но хотите, чтобы размер каждого раздела не превышал X, за один раз заполните одно ведро и создайте следующий ковш, когда предыдущий заполнен. –

0

Вы можете просто использовать по модулю для разделения разделов:

subject.hashCode() % 10 

разделится более или менее равномерно по десяти разделов.

+2

Что заставляет вас думать, что коллекция предметов будет производить примерно равномерное распределение хэш-кодов? Здесь нет никакой гарантии, используя базовую реализацию String, потому что распределение управляется данными. У субъектов троек, вероятно, будут некоторые чрезвычайно распространенные и некоторые редкие, что дает неравномерное распределение, даже если хэш-функция даже по множеству значений. –

+0

@EsotericScreenName Спасибо за ваш комментарий. Не могли бы вы подумать о каком-либо другом решении? Я не думаю, что есть какое-то решение. –

+2

@javadeveloper Основная проблема заключается в том, что вы разбиваете по темам - где вы на самом деле не знаете, приведет ли такое разбиение к разумному «распространению» (может быть один субъект с 10 000 троек, а один субъект с 3 в ваших данных). Если ваша цель состоит в том, чтобы создать раздел файлов с достаточно равномерным размером, вам не нужно вообще смотреть на объект. –

 Смежные вопросы

  • Нет связанных вопросов^_^