2015-11-21 4 views
0

У меня есть программа, которая в начале генерирует большой объем данных (несколько ГБ, возможно, более 10 ГБ), а затем несколько раз обрабатывает все данные, что-то делает, обрабатывает все данные, делает что-то ... Такое количество данных не вписывается в мою оперативную память, и когда он начинает пейджинг, это действительно больно. Каков оптимальный способ хранения моих данных и вообще, как решить эту проблему?Как хранить большой объем данных

Должен ли я использовать БД, хотя мне не нужно сохранять данные после окончания моей программы? Должен ли я каким-то образом разделить мои данные и просто сохранить их в файлах и загрузить их, когда они мне понадобятся? Или просто продолжайте использовать ОЗУ и переходите к поисковому вызову?

С БД и файлами возникает проблема. Мне приходится обрабатывать данные по частям. Поэтому я загружаю кусок данных (скажем, 500 Мб), вычисляю, загружаю следующий кусок, а после загрузки и вычисления всего, я могу что-то сделать и повторить цикл. Это означает, что я буду читать с HDD те же куски данных, которые я читал в предыдущем цикле.

+0

Используйте MongoDB, разделите свои данные на логические единицы, сохраните их в документах и ​​используйте [свою структуру агрегации] (https://docs.mongodb.org/manual/aggregation/) для их обработки. Весы до терабайт и просты в использовании и настройке. –

ответ

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

файла стиля будет достаточно для вашей задачи, пара образца:

  1. Use BuffereReader skip() method
  2. RandomAccessFile

Прочитайте это два, и проблема с кусками дублирования должна исчезнуть.

+0

Думаю, я плохо описал свою проблему. Я генерирую некоторые данные. Затем я вычисляю что-то из данных, делаю некоторые изменения (а не данные, данные остаются неизменными) и вычисляет снова ... Это означает, что в каждом цикле я прочитаю весь файл в памяти после части, потому что весь файл не работает, t вписывается в память – user3396293

+0

Или мое описание ужасно. 1. Сохраните все данные в файле (теперь его u db). 2. Прочтите во временный буфер от 0 до 250 мб - данные процесса и буфер сброса/сброса/закрытия. 3. Прочитайте дальше в буфер, последняя партия - один цикл завершен. – EnjoyLife

0

Вы должны обязательно попытаться уменьшить объем данных и иметь несколько потоков для обработки ваших данных.

FutureTask может помочь вам:

ExecutorService exec = Executors.newFixedThreadPool(5); 
FutureTask<BigDecimal> task1 = new FutureTask<>(new Callable<BigDecimal>() { 

    @Override 
    public BigDecimal call() throws Exception { 
     return doBigProcessing(); 
    } 

}); 

// start future task asynchronously 
exec.execute(task1); 

// do other stuff 

// blocking till processing is over 
BigDecimal result = task1.get(); 

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

Если этого недостаточно, вы можете использовать инфраструктуру Apache Spark для обработки больших наборов данных.

+0

Моя программа уже многопоточная, но это не изменяет проблему с данными. Посмотрите в Spark и другие базы данных NoSQL – user3396293

0

Перед тем, как думать о производительности вы должны рассмотреть сильфонный:

  • найти хорошую структуру данных для данных.
  • найти хорошие алгоритмы обработки данных.

Если у вас нет достаточно места памяти,

  • использование памяти отображается файл для работы на данных

Если у вас есть возможность обрабатывать данные без нагрузки все данные

  • делить и владеть

И, пожалуйста, дайте нам более подробную информацию.