如何将 1 亿行加载到内存中

2023-12-09

我需要将 1 亿多行从 MySQL 数据库加载到内存中。我的 java 程序失败了java.lang.OutOfMemoryError: Java heap space我的机器有 8GB RAM,并且我在 JVM 选项中指定了 -Xmx6144m。

这是我的代码

public List<Record> loadTrainingDataSet() {

    ArrayList<Record> records = new ArrayList<Record>();
    try {
        Statement s = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
        s.executeQuery("SELECT movie_id,customer_id,rating FROM ratings");
        ResultSet rs = s.getResultSet();
        int count = 0;
        while (rs.next()) {

知道如何克服这个问题吗?


UPDATE

我碰到这个帖子,以及根据下面的评论我更新了我的代码。看来我能够以相同的 -Xmx6144m 量将数据加载到内存中,但这需要很长时间。

这是我的代码。

...
import org.apache.mahout.math.SparseMatrix;
...

@Override
public SparseMatrix loadTrainingDataSet() {
    long t1 = System.currentTimeMillis();
    SparseMatrix ratings = new SparseMatrix(NUM_ROWS,NUM_COLS);
    int REC_START = 0;
    int REC_END = 0;

    try {
        for (int i = 1; i <= 101; i++) {
            long t11 = System.currentTimeMillis();
            REC_END = 1000000 * i;
            Statement s = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                    java.sql.ResultSet.CONCUR_READ_ONLY);
            s.setFetchSize(Integer.MIN_VALUE);
            ResultSet rs = s.executeQuery("SELECT movie_id,customer_id,rating FROM ratings LIMIT " + REC_START + "," + REC_END);//100480507
            while (rs.next()) {
                int movieId = rs.getInt("movie_id");
                int customerId = rs.getInt("customer_id");
                byte rating = (byte) rs.getInt("rating");
                ratings.set(customerId,movieId,rating);
            }
            long t22 = System.currentTimeMillis();
            System.out.println("Round " + i + " completed " + (t22 - t11) / 1000 + " seconds");
            rs.close();
            s.close();
        }

    } catch (Exception e) {
        System.err.println("Cannot connect to database server " + e);
    } finally {
        if (conn != null) {
            try {
                conn.close();
                System.out.println("Database connection terminated");
            } catch (Exception e) { /* ignore close errors */ }
        }
    }
    long t2 = System.currentTimeMillis();
    System.out.println(" Took " + (t2 - t1) / 1000 + " seconds");
    return ratings;
}

加载前 100,000 行需要 2 秒。加载第 29 个 100,000 行花了 46 秒。我中途停止了这个过程,因为它花费了太多时间。这些时间是可以接受的吗?有没有办法提高这段代码的性能? 我在 8GB RAM 64 位 Windows 机器上运行它。


一亿条记录意味着每条记录最多可能占用 50 个字节,以便容纳在 6 GB 内 + 一些用于其他分配的额外空间。在 Java 中 50 字节不算什么;仅仅Object[]每个元素占用 32 个字节。您必须找到一种方法来立即在您的应用程序中使用结果while (rs.next())循环而不是完整保留它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 1 亿行加载到内存中 的相关文章

  • 无法实例化接收器 com.parse.GcmBroadcastReceiver

    我正在编写一个使用 GCM 通知和解析推送的离子应用程序 这个应用程序正在使用这些插件 com ionic keyboard 1 0 3 Keyboard com phonegap plugins PushPlugin 2 4 0 Push
  • 如何在 Struts 2 OGNL 中将参数传递给方法调用

    我想使用属性作为对象方法的参数
  • sql查询获取从一月到当月的所有数据,即使没有记录

    我不擅长 sql 所以任何帮助世界都很棒 我有一个 SQL 查询 可以获取从一月到当月注册的记录 我的代码示例 SELECT DatePart YEAR p createStamp as TheYear DatePart MONTH p c
  • Java 唤醒休眠线程

    我阅读了其他帖子 但没有找到我正在寻找的确切答案 所以我希望有人能给出一些澄清 我有一个将运行一段时间的程序 我有一些在后台运行的线程来执行各种任务 为了简单起见 让我们考虑 3 个线程 ThreadA每 10 秒执行一次任务 其中Thre
  • 从关卡堆栈中获取相对比例的数学

    为这个可怕的标题道歉 我花了 10 分钟试图用一句话来解释这一点 但失败了 虽然提示这个问题的应用程序是用Java Android 编写的 但我认为它非常通用并且适用于任何语言 欢迎使用伪代码 或简单的英语 回复 我不确定是否应该标记所有通
  • BlackBerry SQLite:将一个 SQLite 数据库连接到另一个

    我正在尝试使用 SQLite 将一个 SQLite 数据库附加到 BlackBerry 上的另一个数据库附加数据库 http www sqlite org lang attach html命令 Database d1 d2 Statemen
  • 打印 jasper 文件时执行报表 SQL 语句时出错

    我修改了一个旧项目 但无法确定这段代码有什么问题 使用下面的 jrxml它创造 jasper文件 当我打印 jasper 文件时 使用此代码JasperPrint jasperPrint JasperFillManager fillRepo
  • Java ConcurrentModificationException [重复]

    这个问题在这里已经有答案了 当删除倒数第二个元素时 没有 ConcurrentModificationException List
  • 如何使用云打印打印Android活动显示

    我正在尝试将 Google 云打印实现到应用程序中 遵循集成指南 https developers google com cloud print docs android 我试图通过打印 google com 来保持基本 单击我创建的打印按
  • 在服务器内部调用 Web 服务

    我有一个网络服务 getEmployee 当传递 id 时 它会获取单个员工的员工详细信息 同一服务器上的另一个 Web 服务 getEmployeeList 当传递一个部门时 它会获取整个员工列表 这将获取部门的 ID 然后调用 getE
  • 在存储过程中验证用户的最简单方法?

    我需要一个存储过程 可以通过发送以下内容来检查登录尝试时他们是否是有效用户login and password查看它们在数据库中是否匹配 有没有一种简单的方法可以做到这一点 如果没有更多信息 我目前能提供的最好信息是 CREATE STOR
  • scala中的协变类型参数需要在java接口中保持不变

    我有一个看起来像这样的特征 一些进一步的信息可以在我自己提出了这个相关问题 https stackoverflow com questions 3695990 inheritance and automatic type conversio
  • 从命令行运行 Maven 插件的语法是什么。

    我看到这里已经有人问过这个问题 如何从命令行执行maven插件 https stackoverflow com questions 12930656 how to execute maven plugin from command line
  • 读/写带有特殊字符的.txt文件

    I open Notepad Windows 并写 Some lines with special characters Special 并前往另存为 someFile txt 与Encoding set to UTF 8 在Java中我有
  • Selenium - 等待网络流量

    我们将 Selenium 与 Java API 和一些 Javascript 用户扩展一起使用 我们在应用程序中使用了大量 AJAX 调用 我们的许多测试随机失败 因为有时 AJAX 调用完成得比其他时候慢 因此页面未完全加载 我们通过等待
  • H2 - (相当)长的 INSERT 失败,错误 42000

    H2 内存中 插入 错误 42000 尝试过版本 1 4 196 1 4 197 1 4 199 我还尝试在 H2 服务器 本地 上执行 INSERT 也失败 给出错误的行 抱歉 但出于安全原因 我无法生成更多 INSERT INTO tb
  • 将带有 webapp 的 WAR 部署到 Maven 中央存储库是否有意义?

    这样做有意义吗 如果是 我在哪里可以找到使用简单的 Web Hello World 执行此操作的示例 当人们从 Maven 执行 Web 应用程序时 他们会使用 Jetty 来运行它吗 我想 tomcat 太重了 任何帮助将不胜感激 谢谢
  • 编写自定义 Eclipse 调试器

    EDIT 一定有某种方法可以解决这个问题 而无需编写全新的调试器 我目前正在研究在现有 java 调试器之上构建的方法 如果有人对如何获取 Java 调试器已有的信息 有关堆栈帧 变量 原始数据等 有任何想法 那将非常有帮助 我想要做的是我
  • java.io.EOFException:没有更多可用数据 - 预期结束标记 关闭开始标记

    我正在使用 xmpp 开发一个聊天应用程序 根据我们的要求 我们有三台服务器 Apache Tomcat 7 ejabbered 2 1 11 和 mysql 5 5 to run xmppbot on tomcat used below
  • Integer.parseInt 引发的 NumberFormatException

    嘿 我在学校上编码课 但老师没有很好地解释 所以我们必须在网上查找我所做的信息 但我无法找到代码中的错误 你能帮我吗 char end s do System out println Tipo de boleto char boleto c

随机推荐

  • 在VBA中修改现有的excel连接名称

    我需要更新 Excel 工作簿的 SQL 连接的连接名称 这是我的尝试 我已经能够通过执行标准替换来修改连接字符串和命令文本 Sub ConnectionString modify Dim i As Long Dim cnt As Long
  • 我想使用 .htaccess 从网址中删除问号和 .php 扩展名

    我在 htaccess 中遇到重定向 URL 问题 我想从 URL 中删除 php 和问号 例如 www example com test php id 12 to www example com test 12需要这样的格式 我尝试在我的
  • 获取QTextEdit选择的边界框

    我试图获取存储在列表中的一系列文本选择的边界框 边界框是可以包含整个选择的最小矩形 列表中的每个项目都有一个起始点和结束点 以字符数为单位从起始点开始计算QTextEdit窗口和字母标识符 QTextEdit cursorRect curs
  • DT 默认折叠所有行组

    我试图默认情况下使数据表中的所有行组折叠 我目前的实施 library shiny library DT ui lt fluidPage Application title titlePanel Collapse Expand table
  • 如何从 PHP 网站向 iOS 和 Android 发送推送通知?

    如何从 PHP 网站向 iOS 设备和 Android 设备发送推送通知 有这方面的教程吗 您可以使用多种预制服务来推送通知 例如 Firebase Messaging One Signal 等 有关与 PHP 集成的 Firebase 云
  • 在 iPhone OS 4.0 中以编程方式获取自己的电话号码

    我正在为越狱手机开发一个iPhone应用程序 在这个应用程序中我想获取用户的电话号码 我浏览了整个 stackoverflow com 并找到了一些相关答案 但所有这些答案都已过时 并且不再适用于 iOS 4 0 这个问题最著名的解决方案是
  • 简单的 CSS 转换 - 没有任何效果

    我正在处理一个具有悬停时消失的渐变的图像 但是 我无法对此进行转换 我已经尝试了我所知道的所有 webkit 转换 但它似乎不起作用 这是 HTML a href http calvarygigharbor com heavenly hit
  • 当分支未显示在 gitbranch -l 中时更改分支

    当我克隆远程存储库时 我使用了以下命令 git clone b mybranch single branch git sub domain com repo git 之后 当我做了一个git branch l它只是向我展示了我克隆的分支 现
  • 对象引用丢失,但保留资源

    IndentedTextWriter tw new IndentedTextWriter internalTW tw 引用的对象丢失 但相关资源未在此处处置 TW 是文本编写器 其中internalTW是TextWriter OleDbCo
  • 使用验证集、训练集和测试集之间的顺序

    我试图了解机器学习中模型评估和验证的过程 具体来说 必须按什么顺序以及如何使用训练 验证和测试集 假设我有一个数据集 我想使用线性回归 我在各种多项式次数 超参数 之间犹豫不决 In 这篇维基百科文章 这似乎暗示顺序应该是 将数据分为训练集
  • Razor 引擎找不到视图

    Issue 我目前有一个 NET Core 库 用于将 Razor 页面呈现为 HTML 电子邮件 我正在关注本教程 编译时没有错误 但在运行时出现以下错误 无法找到视图 Views Emails NewOrder NewOrder csh
  • Gruntwiredep 没有连接一些 Bower 组件

    我正在使用 yeoman webapp 生成器生成一个模板来开始我的工作 此时 我的 Bower json 看起来像这样 name sample project private true dependencies bootstrap sas
  • 通过正则表达式替换 StringBuilder 中的文本

    我想替换 StringBuilder 中的一些文本 这个怎么做 在这段代码中我得到了java lang StringIndexOutOfBoundsException与matcher find StringBuilder sb new St
  • 如何在不通过 CMD 提供 VM 参数的情况下执行 JAVA FX 11 JAR

    Java JDK 12构建工具 Maven集成开发环境 Eclipse操作系统 Windows 我有一段简单的 java FX 11 代码 它显示一个简单的空白屏幕 我已经使用 eclipse 部署了一个可执行 jar 当我使用 CMD 给
  • Laravel 5 中 JavaScript 的部分视图

    我有多个部分刀片文件 它们都只需要一点点 JavaScript 理想情况下 我希望部分加载它需要的 JS 而普通 JS 不会包含它 我知道你可以将它们全部加载到一个大的 JS 文件中 但我想知道是否有一种方法可以提供更优雅的解决方案 我希望
  • 如何允许 python 信任我的服务器的 TLS 自签名证书:ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败

    这不是重复的这个帖子 我尝试了那里的解决方案 但对我的情况没有任何作用 我使用的是 Windows 和 Python 3 6 5 我有一个用于 TLS 客户端的 python 脚本 我需要连接的服务器使用自签名证书 当我尝试使用脚本连接到它
  • BigQuery UDF 内部错误

    我们在 BigQuery 中有一个简单的 UDF 它会以某种方式抛出一个不断返回的错误 Query Failed Error An internal error occurred and the request could not be c
  • 来自宽 pandas.DataFrame 的分组seaborn.barplot

    我有 pandas 数据框 一个索引 日期时间 和三个变量 int date A B C 2017 09 05 25 261 31 2017 09 06 261 1519 151 2017 09 07 188 1545 144 2017 0
  • 如何在 SwiftUI 中设置窗口在桌面上的位置?

    如何在 SwiftUI 中设置窗口坐标MacOS 桌面 例如 窗口应该始终出现在center或者总是在上层右上角 这是我的版本 但是 我移动代码并关闭它 当我打开它时 它首先出现在旧位置 然后跳转到新位置 import SwiftUI le
  • 如何将 1 亿行加载到内存中

    我需要将 1 亿多行从 MySQL 数据库加载到内存中 我的 java 程序失败了java lang OutOfMemoryError Java heap space我的机器有 8GB RAM 并且我在 JVM 选项中指定了 Xmx6144