Я работаю над графическим/обработчиком данных (вы можете увидеть скриншот здесь), используя Clojure (хотя, часто кажется, что я использую больше Java, чем Clojure), и начал тестировать мое приложение с большими наборами данных. У меня нет проблем с примерно 100 тыс. Очков, но когда я начинаю становиться выше, я сталкиваюсь с проблемами в области кучи.
Теперь, теоретически, около половины ГБ должно быть достаточно, чтобы удерживать около 70 миллионов удвоений. Конечно, я делаю много вещей, требующих некоторых накладных расходов, и на самом деле я могу хранить 2-3 копии данных в памяти одновременно, но я пока еще не оптимизировал, а 500 тыс. Или около того - все еще заказы меньше, чем я должен иметь возможность загрузить.
Я понимаю, что Java имеет искусственные ограничения (которые могут быть изменены) на размер кучи, и я понимаю, что они могут быть изменены, частично, с параметрами, которые вы можете указать при запуске JVM. Это приводит меня к моим первым вопросам:
-
Могу ли я изменить максимально допустимое пространство кучи, если я использую Swank- Clojure (через Leiningen), который JVM имеет при запуске?
-
Если я упакую это приложение (как я планирую) в качестве Uberjar, смогу ли я обеспечить, чтобы моя JVM имела какое-то минимальное пространство кучи?
Но я не доволен тем, что просто полагаюсь на кучу JVM для подачи моего приложения. Я не знаю размер данных, с которыми я, возможно, в конечном итоге буду работать, но он может достигнуть миллионов очков, и, возможно, куча не может это принять. Поэтому мне интересно найти альтернативы простому накоплению данных. Вот некоторые идеи, которые у меня были, и вопросы о них:
-
Можно ли читать только части большого (текстового) файла за раз, поэтому я мог импортировать и обрабатывать данные в "кусках", например,
n
строк за раз? Если да, то как? -
Есть ли более быстрый способ доступа к файлу, который я буду читать (потенциально быстро, в зависимости от реализации), кроме простого чтения из него немного за раз? Наверное, я прошу здесь о любых советах/хаках, которые работали для вас в прошлом, если вы сделали аналогичную вещь.
-
Могу ли я "пробовать" из файла; например читать только каждые строки
z
, эффективно понижая выборку моих данных?
Сейчас я планирую, если есть ответы на вышеизложенное (я продолжу поиск!) или идеи, которые приводят к эквивалентным решениям, читайте в куске данных за раз, нарисуйте график на временной шкале (см. скриншот - временная шкала зеленая) и позволяет пользователю взаимодействовать с этим битом, пока она не нажмет next chunk
(или что-то еще), то я бы сохранил внесенные изменения в файл и загрузил следующий "кусок" данных и отобразил его.
В качестве альтернативы, я бы отображал всю временную шкалу всех данных (с пониженной дискретизацией, поэтому я мог ее загрузить), но разрешать доступ к одному "куску" из нее за раз в главном окне (часть, которая просматривается над зеленой временной шкалой, как показано прямоугольником видового экрана на временной шкале).
Больше всего,, но есть лучший способ? Обратите внимание, что я не могу уменьшить данные первичного окна, так как мне нужно иметь возможность обрабатывать его и позволить пользователю взаимодействовать с ним (например, щелкнуть точку или рядом с ней, чтобы добавить "маркер" к этой точке: этот маркер рисован как вертикальное правило над этой точкой).
Буду признателен за любые идеи, ответы, предложения или исправления! Я также хочу изложить по моему вопросу, каким бы вы ни хотели.
Это, мы надеемся, по крайней мере частично, будет открытым; Мне нужен простой в использовании, но быстрый способ сделать xy-графики большого количества данных в мире Clojure.
РЕДАКТИРОВАТЬ Даунсэмплинга возможна только при графике, а не всегда тогда, в зависимости от гравюры частей. Мне нужен доступ ко всем данным для проведения анализа. (Просто очистив это!) Хотя я должен определенно смотреть на понижающую дискретизацию, я не думаю, что это решит проблемы с моей памятью, поскольку все, что я делаю для графика, опирается на BufferedImage.