Обработка больших данных в Java: как загрузить в память сотни миллионов данных
Обработка больших данных в Java: как загрузить в память сотни миллионов данных

Привет, друзья, здравствуйте, я Мяу Шоу. Сообщество операторов: Station C/Nuggets/Tencent Cloud/Alibaba Cloud/Huawei Cloud/51CTO, каждый может часто посещать их;

хорошие вещи случаются

  Вот вам практический советизхорошая статья:《Java Z Как сборщик мусора меняет управление памятью? 》 От автора:грибок-ошибка

Автор этой статьи фокусируется на сборщике мусора Z, который представляет собой эффективный инструмент управления памятью, предназначенный для обеспечения низкой задержки и высокой пропускной способности. Его философия проектирования полностью учитывает потребности современных приложений и позволяет поддерживать стабильную производительность в сценариях с высоким уровнем параллелизма. Он подробно обсудит принцип работы, сценарии применения, преимущества и недостатки ZGC с различных аспектов и объединит это с реальными примерами кода, чтобы помочь каждому лучше понять и применить этот мощный инструмент. Хорошая статья, поставьте ему палец вверх!

Привет, друзья, здравствуйте, я Мяу Шоу. Сообщество операторов: Station C/Nuggets/Tencent Cloud/Alibaba Cloud/Huawei Cloud/51CTO, каждый может часто посещать их;

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

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

Друзья, в процессе рассмотрения, если вы считаете статью хорошей, ставьте лайк, собирайте и подписывайтесь на нее. Санлиан — лучшая поддержка и поддержка для меня и автора на моем писательском пути!

Предисловие

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

В этом выпуске,Мы будем и дальше расширять наши знания об управлении памятью.,Основные моментыКак обрабатывать сотни миллионов больших данных в Java-приложениях。Когда мы сталкиваемся с большими даннымисценачас,Управление памятью особенно важно,Как эффективно загружать и обрабатывать сотни миллионов данных в памяти,Становится основной задачей оптимизации производительности приложений Java. Эта статья подробно объяснит эту тему,от Анализ исходного кодаприезжать Сценарии применения, чтобы вы могли четко усвоить лучшие практики Java в обработке больших данных.


краткое содержание

В современной разработке приложений обработка огромных объемов данных стала нормой. Язык Java известен своим надежным механизмом. управления память и мощная поддержка сторонних библиотек стали одними из предпочтительных языков для обработки больших данных. Однако загрузка сотен миллионов данных в память требует от нас уделять особое внимание эффективности и экономичности памяти в процессе разработки. мусора Стратегия и выбор структур данных. В этой статье будет подробно рассмотрено техническое решение для загрузки сотен миллионов данных в память на Java с использованием Анализа. исходного код, использовать Случай, сцены приложений, тестирование производительности и Анализ преимуществ и недостатков,И в сочетании с анализом основных методов класса,Дайте практическую ссылку.


Обзор

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

Основные проблемы:

  • предел памяти:Как эффективно хранить большие объемы данных в ограниченной памяти?
  • Сбор мусора:После загрузки большого количества данных,Как предотвратить чрезмерное влияние GC на работу программы?
  • Параллельная обработка:Как использовать многопоточность или параллельную обработку для повышения эффективности обработки данных?

Ключевые технические моменты:

  • использовать Подходящая структура данных, такая какArrayListHashMapConcurrentHashMapхранить и обрабатывать большие данные。
  • использоватьфайл, отображенный в памяти(Memory-mapped file) технология для обработки чрезвычайно больших данных.
  • Оптимизируйте производительность загрузки данных за счет загрузки фрагментов, пакетной обработки, потоковой обработки и т. д.

Анализ исходного кода

При загрузке сотен миллионов данных в Java,Выбор структуры данных имеет решающее значение. Ниже приведен простой пример кода.,покажи как пройтиЗагружать партиямиСотни миллионов данных,и использоватьArrayListхранить данные。

Язык кода:java
копировать
import java.util.ArrayList;

public class LargeDataLoader {
    
    private static final int BATCH_SIZE = 1000000; // Загружайте 1 миллион фрагментов данных каждый раз
    
    public static void main(String[] args) {
        ArrayList<String> data = new ArrayList<>();
        int totalRecords = 100000000; // Предположим, что необходимо загрузить 100 миллионов фрагментов данных.
        loadDataInBatches(data, totalRecords);
    }

    // Загружать партиямиданные    public static void loadDataInBatches(ArrayList<String> data, int totalRecords) {
        int loaded = 0;
        while (loaded < totalRecords) {
            int nextBatch = Math.min(BATCH_SIZE, totalRecords - loaded);
            for (int i = 0; i < nextBatch; i++) {
                data.add("Record " + (loaded + i));
            }
            loaded += nextBatch;
            System.out.println("Загружено: " + loaded + " данные");
        }
    }
}

Анализ исходного кода:

  1. BATCH_SIZE:Установить размер партии,Избегайте переполнения памяти, вызванного одновременной загрузкой слишком большого количества данных.
  2. Загружать партиями:шаг за шагом по циклам Загрузить данные,Вставка партиямиArrayList,Не занимайте слишком много памяти за один раз при загрузке больших данных.
  3. Мониторинг памяти:в большомданныесцена Вниз,Состояние памяти должно постоянно контролироваться.,Предотвратить переполнение.

Ниже приводится подробный Анализ кода: Анализ выглядит следующим образом:

Этот код Java определяет функцию под названием LargeDataLoader класс, который содержит main метод и loadDataInBatches Статический метод пакетной загрузки больших объемов данных в ArrayList середина.

Вот как выглядит этот код:

  1. import java.util.ArrayList;:ИмпортированоJavaиз ArrayList добрый.
  2. public class LargeDataLoader { ... }:определяет файл с именем LargeDataLoader Публика добрый.
  3. Определение констант:
    • private static final int BATCH_SIZE = 1000000;:определяет константу BATCH_SIZE,Объем данных, что означает каждую загрузку,Это установлено на1,000,000 (один миллион).
  4. public static void main(String[] args) { ... }:определенная процедураизосновная точка входа main метод.
  5. создавать ArrayList
    • ArrayList<String> data = new ArrayList<>();:создать одиниспользуется для Сохранить строкуиз ArrayList
  6. Определение и Загрузить данные:
    • int totalRecords = 100000000;:определить целое число totalRecords,Указывает общее количество записей для загрузки,Это установлено на100,000,000 (сто миллионов).
  7. Способ вызова Загрузить партиямиданные:
    • loadDataInBatches(data, totalRecords);:вызов loadDataInBatches метод, передать ArrayList и общее количество записей.
loadDataInBatches метод:
  1. Определить локальные переменные
    • int loaded = 0;:Определить счетчик loaded,Используется для отслеживания загруженного объема данных.
  2. Загрузка данных в цикле
    • while (loaded < totalRecords) { ... }:использоватьwhileцикл,прямойприезжатьнагрузкаиз Объем данных равно общему количеству записей.
  3. Рассчитать размер партии
    • int nextBatch = Math.min(BATCH_SIZE, totalRecords - loaded);:вычислить Внизпартияизразмер,Выбирать BATCH_SIZE и оставшийся незагруженным Объем Меньшее значение между данными.
  4. Добавьте данные в ArrayList
    • for (int i = 0; i < nextBatch; i++) { data.add("Record " + (loaded + i)); }:использоватьforцикл Добавьте данные в ArrayList
  5. Обновить объем загруженных данных
    • loaded += nextBatch;:更新已нагрузкаиз Объем данных。
  6. Ход печати
    • System.out.println("Загружено: " + loaded + " данные");:Распечатать загруженный Объем данных.
Подробная интерпретация:
  1. Инициализировать контейнер данных
    • создать один ArrayList,Используется для хранения добавляемых данных.
  2. Загружать партиямиданные
    • использоватьwhileцикл,Загружать партиямиданные,Загрузите один миллион товаров в партию,Пока он не достигнет 100 миллионов единиц данных.
  3. Ход печати
    • После завершения каждой пакетной загрузки,Распечатать загруженный Объем данных.
краткое содержание:

Цель этой программы — продемонстрировать, как загружать большой объем данных (100 миллионов элементов) пакетами в ArrayList для уменьшения потребления памяти и повышения производительности. Загружая данные порциями и распечатывая ход выполнения после каждой загрузки, можно эффективно управлять и контролировать процесс загрузки.

Обмен вариантами использования

Кейс 1: Обработка больших данных на платформах электронной коммерции

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

Случай 2. Обработка цепочки взаимоотношений пользователей платформы социальных сетей

Платформам социальных сетей нужныиметь дело с Сложность среди пользователейизцепочка отношенийданные。проходитьфайл, отображенный в памятиБудут ли массовые отношения с пользователямиданныенагрузкаприезжатьв памяти,иобъединитьJavaизипопулярный(Parallel Stream) для расчета цепочки отношений, что может ускорить скорость обработки алгоритма рекомендаций.


Сценарии применения

Сценарий 1: Система анализа журналов

В крупномасштабных системах анализа журналов,Обычно требуется фактическоечасиметь дело смиллионыприезжать Сотни миллионов записей журнала。проходитьПотоковая обработка,Разработчики Java могут избежать одновременной загрузки всех журналов в память.,Вместо этого мы анализируем и обрабатываем данные журнала поэлементно.,Уменьшите потребление памяти.

Сценарий 2: Финансовая торговая система

Финансовые торговые системы часто обрабатывают сотни миллионов данных о транзакциях. в этом случае,JavaРазработчики обычноиспользоватьРаспределенный кеш(нравитьсяRedis)временно хранитьданные,Объединение пакетной обработки и регулярного обновления кэша,Обеспечьте работу системы в режиме реального времени и стабильность.


Анализ преимуществ и недостатков

преимущество:

  1. Высокая гибкость:JavaПоддержка несколькихданныеструктура ииметь дело с Способ,Вы можете выбрать подходящее решение, исходя из реальной ситуации.
  2. Хорошая масштабируемость:проходитьJVMТюнинг и Распределенный кеш и других технологий, Java может справиться с потребностями обработки сверхбольших данных.
  3. Поддержка многопоточности:Javaизи Модель программирования позволяет нам легко реализовать многопоточность.иметь дело с,Повышение эффективности обработки данных.

недостаток:

  1. Проблема со сборщиком мусора:вместе с Объем данных Увеличивать,GC может часто срабатывать,Вызывает снижение производительности приложения.
  2. Высокое использование памяти:крупный масштабданныенагрузка至в памяти,Может легко привести к переполнению памяти,Требуется осторожность.

Введение в основные методы класса

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

2. HashMap:хранилище пар ключ-значение,Подходит для быстрого поиска и вставки данных.

3. ConcurrentHashMap:Безопасность резьбыиз Хэш-таблица,Подходит для массовой обработки данных в многопоточности.

4. MappedByteBuffer:используется дляфайл, отображенный в памятииметь дело с,Отображение файла в памяти,Избегайте загрузки больших файлов одновременно.


тестовый пример

Чтобы проверить производительность Java при загрузке сотен миллионов данных, мы разработали простой тест производительности.

тестовый код

Язык кода:java
копировать
import java.util.ArrayList;

public class LargeDataTest {

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        
        ArrayList<String> data = new ArrayList<>();
        int totalRecords = 50000000; // Тестовая загрузка 50 миллионов фрагментов данных
        for (int i = 0; i < totalRecords; i++) {
            data.add("Record " + i);
        }
        
        long endTime = System.currentTimeMillis();
        System.out.println("Загрузить данныекропотливый: " + (endTime - startTime) + " ms");
    }
}

результат:

  • Объем данных:5000Тысячи штук
  • кропотливый:в обычномиз4ядерный8GBПамятьизна машине,данныенагрузкакропотливыйок.12 секунд

Анализ кода

Ниже приводится конкретный анализ код, надеюсь, это поможет всем: Этот код Java определяет функцию под названием LargeDataTest класс, который содержит main Метод тестирования загрузки больших объемов данных в ArrayList время, проведенное в.

Вот как выглядит этот код:

  1. import java.util.ArrayList;:ИмпортированоJavaиз ArrayList добрый.
  2. public class LargeDataTest { ... }:определяет файл с именем LargeDataTest Публика добрый.
  3. public static void main(String[] args) { ... }:определенная процедураизосновная точка входа main метод.
  4. Запись начинаетсячасмежду:
    • long startTime = System.currentTimeMillis();:вызов System.currentTimeMillis() Метод записывает текущее время (миллисекунды) для последующих расчетов. Загрузить данные затраченное время.
  5. создавать ArrayList
    • ArrayList<String> data = new ArrayList<>();:создать одиниспользуется для Сохранить строкуиз ArrayList
  6. Определение и Загрузить данные:
    • int totalRecords = 50000000;:определить целое число totalRecords,Используется для хранения общего количества записей для загрузки.,Это установлено на50,000,000 (пятьдесят миллионов).
    • for (int i = 0; i < totalRecords; i++) { data.add("Record " + i); }:использоватьforциклдобавить пять тысяч Тысячи штукданныеприезжать ArrayList середина. Каждый фрагмент данных представляет собой строку в формате. "Record " Добавьте серийный номер.
  7. Конец записичасмежду:
    • long endTime = System.currentTimeMillis();:сновавызов System.currentTimeMillis() Метод записывает текущее время.
  8. вычислитьи Распечататькропотливый:
    • System.out.println("Загрузить данныекропотливый: " + (endTime - startTime) + " ms");:вычислить Загрузить укажите время, которое это заняло (миллисекунды), и распечатайте его.
Подробная интерпретация:
  1. Инициализировать таймер
    • использовать System.currentTimeMillis() Запись метода Загрузить время данных раньше.
  2. Создать контейнер данных
    • создать один ArrayList,Используется для хранения добавляемых данных.
  3. Загрузить данные
    • использоватьforцикл,Цикл пятьдесят миллионов раз,каждый разцикл К ArrayList Добавьте новый фрагмент данных.
  4. Останови таймер и посчитай кропотливый
    • использовать System.currentTimeMillis() Запись метода Загрузить данные время спустя и рассчитать Загрузить данные Общее затраченное время.
  5. Вывод результатов
    • Распечатать Загрузить данные затраченное время.
краткое содержание:

Цель этой программы — протестировать загрузку большого количества данных (50 миллионов элементов) в ArrayList Время, необходимое для оценки способности программы обрабатывать большие объемы данных. Записав время до и после загрузки данных и посчитав разницу, можно получить количество миллисекунд, необходимое для загрузки данных.

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


Краткое изложение полного текста

В этой статье,Мы делимся с «Случаем» детальным анализом исходного кода.,представилнравитьсягдеJavaсерединаиметь дело с Сотни миллионовданные。ИлииспользоватьArrayListHashMapConcurrentHashMap,все ещепроходитьфайл, отображенный в Для обработки больших данных Java предоставляет множество опций и решений по оптимизации. Путем разумного выбора структуры данных Загрузить партиямиа также Управление памятью Стратегия,Разработчики могут значительно повысить производительность Java-приложений при работе с большими данными.


Подвести итог

С наступлением эры больших данных,Задача Java-разработчиков больше не заключается в простом написании функционального кода.,Скореенравитьсягде有限изв памяти高效нагрузка、Обрабатывайте огромные объемы данных. Эта статья начинается с базовой структуры данных.、Управление памятью、Параллельная Обработка и другие аспекты обсудили лучшие практики обработки сотен миллионов данных на языке Java, а также предоставили практические примеры кода и сценарии. применения。проходитьосвоить эти техники,Разработчики лучше подготовлены к решению будущих проблем, связанных с большими данными,Обеспечить стабильность и эффективность системы.

Конец статьи

Хорошо, это весь мой контент по этому выпуску. Если у вас есть вопросы, оставьте сообщение ниже. Увидимся в следующем выпуске.

... ...

Нет порядка обучения, нет объема знаний; как бы ни было дело велико или мало, следует спрашивать совета непредвзято, если нас трое, у нас должен быть учитель! ! !

wished for you successed !!!

***

⭐️Если я вам нравлюсь, подписывайтесь на меня.

⭐️Если вам было полезно, поставьте лайк.

⭐️Если у вас есть вопросы, оставьте комментарий и дайте мне знать.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose