Совет относительно обработки больших объемов данных

На Xiaomi Mi5s с MIUI8.3 (Android 6) Xiaomi.EU Rom:

Настройки / Другие настройки / Параметры разработчика / Включить: Разрешить отладку USB, Разрешить установку USB и Разрешить отладку USB (Безопасность опции)

{Извините за перевод, мое устройство имеет испанский}

6
задан Brian Tompsett - 汤莱恩 21 October 2015 в 08:44
поделиться

11 ответов

Таким образом, что, если обработка требует перехода вокруг в данных для нескольких файлов и нескольких буферов? Постоянное открытие и закрытие двоичных файлов собирающийся становиться дорогими?

Я - большой поклонник 'i/o с отображенной памятью', иначе 'прямые буферы байта'. В Java их называют, Отображенные Буферы Байта, часть java.nio. (В основном этот механизм использует пейджинговую систему виртуальной памяти ОС, чтобы 'отобразить' Ваши файлы и представить их программно как буферы байта. ОС справится с перемещением байтов к/от диску и памяти автоволшебно и очень быстро.

Я предлагаю этот подход, потому что a) это работает на меня и b) это позволит Вам сфокусироваться на своем алгоритме и позволить JVM, ОС и аппаратному соглашению с оптимизацией производительности. Все к часто, они знают то, что является лучшими больше, чем мы непритязательные программисты.;)

Как Вы использовали бы MBBs в своем контексте? Просто создайте MBB для каждого из Ваших файлов и считайте их, как Вы считаете целесообразным. Необходимо будет только сохранить результаты..

BTW: Сколько данных Вы имеете дело с в ГБ? Если это будет более, чем 3-4GB, то это не будет работать на Вас на 32-разрядной машине, поскольку реализация MBB является ответчиком на адресуемом пространстве памяти архитектурой платформы. 64-разрядная машина и ОС возьмут Вас к 1 ТБ или 128 ТБ отображаемых данных.

Если Вы думаете о производительности, то знаете Kirk Pepperdine (несколько известный гуру производительности Java.) Он связан с веб-сайтом, www.JavaPerformanceTuning.com, который имеет еще немного деталей MBB: Подсказки по Показателям NIO и другой Java связанные с производительностью вещи.

6
ответ дан 9 December 2019 в 22:42
поделиться

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

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

1
ответ дан 9 December 2019 в 22:42
поделиться

Вы могли бы хотеть взглянуть на записи в Широком Проекте Средства поиска (сделайте поиск Google "широкого средства поиска" Java).

Широкое средство поиска включает перечитывание по большому количеству строк в файлах журнала, так посмотрите на реализации Java и посмотрите то, что работало и не работало там.

2
ответ дан 9 December 2019 в 22:42
поделиться

Вы могли преобразовать в двоичный файл, но затем Вы имеете 1 + что-то копии данных, если необходимо иметь в наличии оригинал.

Это может быть практично для создания некоторого индекса сверху исходных данных ASCII, так, чтобы, если необходимо пройти данные снова, можно было сделать это быстрее в последующие времена.

Отвечать на Ваши вопросы в порядке:

Я должен загрузить все в память внезапно?

Не, если не имеют к. для некоторых файлов Вы можете, но если Вы просто обрабатываете последовательно, просто сделайте некоторые буферизированные прочитывают вещи один за другим, храня независимо от того, что Вам нужно по пути.

В противном случае открывает то, что хороший способ загрузить данные частично?

BufferedReaders/etc является самым простым, хотя Вы могли глубже изучить FileChannel/etc для использования ввода-вывода с отображенной памятью для прохождения через окон данных за один раз.

Каковы некоторые подсказки по эффективности, важные для Java?

Это действительно зависит от того, что Вы делаете с самими данными!

1
ответ дан 9 December 2019 в 22:42
поделиться

Без любого дополнительного понимания, какая обработка продолжается, вот некоторые общие мысли от того, когда я сделал подобную работу.

  1. Запишите прототип своего приложения (возможно, даже "один для выбрасывания"), который выполняет некоторую произвольную операцию на наборе данных. Посмотрите, как быстро это идет. Если самая простая, самая наивная вещь, о которой можно думать, приемлемо быстра, никакие заботы!

  2. Если наивный подход не работает, рассматривает предварительную обработку данных так, чтобы последующие выполнения работали в приемлемый отрезок времени. Вы упоминаете, что имели необходимость "перейти вокруг" в наборе данных вполне немного. Там какой-либо путь состоит в том, чтобы предварительно обработать это? Или, один шаг предварительной обработки может быть должен генерировать еще больше данных - индексные данные - который предоставляет точную байтом информацию о местоположении о критических, необходимых разделах Вашего набора данных. Затем Ваша основная выполненная обработка может использовать эту информацию для перехода прямо к необходимым данным.

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

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

1
ответ дан 9 December 2019 в 22:42
поделиться

Я нашел, что Informatica исключительно полезный инструмент обработки данных. Хорошие новости - то, что более поздние версии даже позволяют преобразования Java. Если Вы имеете дело с терабайтами данных, могло бы быть пора заплатить за лучшие среди аналогов инструменты ETL.

Я предполагаю, что Вы хотите сделать что-то с результатами обработки здесь, как хранилище это где-нибудь.

0
ответ дан 9 December 2019 в 22:42
поделиться

Вы действительно не дали нам достаточно информации для помощи Вам. Необходимо ли загрузить каждый файл в его entiretly для обработки его? Или можно ли обработать его линию за линией?

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

0
ответ дан 9 December 2019 в 22:42
поделиться

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

0
ответ дан 9 December 2019 в 22:42
поделиться

Я рекомендую сильно усилить Регулярные выражения и изучить "новый" IO nio пакет для более быстрого входа. Затем это должно пойти так быстро, как можно реалистично ожидать, что Гигабайты данных пойдут.

0
ответ дан 9 December 2019 в 22:42
поделиться

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

0
ответ дан 9 December 2019 в 22:42
поделиться

Если необходимо получить доступ к данным несколько раз, загрузить его в базу данных. Большинство баз данных имеет своего рода объемную утилиту загрузки. Если данные могут все уместиться в памяти, и Вы не должны иметь в наличии их или получить доступ к ним, что часто, можно, вероятно, записать что-то простое в Perl или любимом языке сценариев.

0
ответ дан 9 December 2019 в 22:42
поделиться
Другие вопросы по тегам:

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