- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在编写一些软件,需要将数据从分层格式扁平化为表格格式。我不想每次都用一种编程语言来完成并提供服务,而是想将结果缓存几秒钟,然后使用 SQL 进行排序和过滤。在使用时,我们说的是在那几秒钟内进行 400,000 次写入和 1 或 2 次读取。
每个表格将包含 3 到 15 列。每行将包含 100 字节到 2,000 字节的数据,但在某些情况下,某些行可能会达到 15,000 字节。如有必要,我可以剪辑数据以保持理智。
我正在考虑的主要选项是:
一个不错的选择,几乎是专门为我的用例编写的!但是……“MEMORY 表使用固定长度的行存储格式。可变长度类型(例如 VARCHAR)使用固定长度存储。MEMORY 表不能包含 BLOB 或 TEXT 列。” - 不幸的是,我的文本字段的长度可能最多可达 10,000 个字符 - 即使是这个数字也没有特别限制。当我循环进行展平时,我可以根据文本列的最大长度调整 varchar 长度,但这并不完全优雅。另外,对于我偶尔的 15,000 个字符的行,这是否意味着我需要为数据库中的每一行分配 15,000 个字符?如果有 100,000 行,那就是 1.3 GB,不包括开销!
这是为了在云上运行,我可以轻松地启动具有 16gb 内存的服务器,配置 MySQL 以写入 tmpfs 并使用全功能的 MySQL。我对此的关注是空间。虽然我确定工程师已经编写了内存引擎来防止消耗所有临时存储和服务器崩溃,但我怀疑该解决方案是否知道何时停止。如果采用数据库格式,我的 2,000 字节数据将占用多少实际空间?我如何监控它?
索引事实上,我会提前知道哪些列需要过滤和排序。我可以在插入之前设置一个索引,但是老实说,我可以期望在 ram 磁盘上获得什么样的性能提升?索引增加了多少额外开销?
插入我假设用一个查询插入多行会更快。但是一个查询或一系列大型查询存储在内存中,我们正在写入内存,所以如果我这样做,我会暂时需要双倍的内存。然后我们讨论一次做一个或两个或一百个,并且必须等待它完成才能处理更多...... InnoDB 不会锁定表但我担心发送两个查询彼此太近并且混淆MySQL。这是一个合理的担忧吗?由于表锁,使用 MEMORY 引擎我必须等待完成。
临时除了在数据库连接关闭时临时表被删除之外,临时表还有什么好处吗?
最佳答案
我建议你使用 MyISAM。为您的查询创建具有适当索引的表。然后禁用 key 、加载表并启用 key 。
我建议您为您的系统制定这样的规程。我非常有效地使用了类似的纪律。
保留表格的两份副本。调用一个 table_active
和第二个 table_loading
。
当需要加载数据的新副本时,使用这样的命令。
ALTER TABLE table_loading DISABLE KEYS;
/* do your insertions here, to table_loading */
/* consider using LOAD DATA INFILE if it makes sense. */
ALTER TABLE table_loading ENABLE KEYS; /* this will take a while */
/* at this point, suspend your software that's reading table_active */
RENAME TABLE table_active TO table_old;
RENAME TABLE table_loading TO table_active;
/* now you can resume running your software */
TRUNCATE TABLE table_old;
RENAME TABLE table_old TO table_loading;
或者,您可以DROP TABLE table_old;
并为table_loading
创建一个新表,而不是上次重命名。
这个双表(双缓冲)策略应该工作得很好。它会产生一些延迟,因为您正在读取表格的软件将在旧副本上运行。但是您将避免从未完全加载的表中读取数据。
我建议使用 MyISAM,因为您不会用完 RAM 并崩溃,而且您不会有固定行长的开销或事务开销。但您也可以考虑 MariaDB 和 Aria 存储引擎,它们在利用 RAM 缓冲区方面做得很好。
如果您确实使用 MEMORY 存储引擎,请务必调整您的 max_heap_table_size
系统变量。如果您的读取查询将使用索引范围扫描(顺序索引访问),请务必指定 BTREE 样式索引。看这里:http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html
关于RAMdisk 上的 MySQL 内存引擎与 InnoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17865520/
好的,所以我在挂载的设备上有一个 Ramdisk 镜像,比方说,/mnt/sda1/Ramdisk.img。我想将原始数据直接复制到位于/dev/ram0 的 ramdisk 设备,这样就不需要使用
我刚想到使用 RAMdisk编译结果1 如何在 Gradle 中使用 RAMdisk? 我觉得值得搬家.gradle和 build文件夹到 RAMdisk。 最佳答案 为了完整起见,以下是我在 Ubu
我创建的一个 python 程序是 IO 有界的。大部分时间(超过 90%)都花在一个重复约 10,000 次的循环中。在这个循环中,生成~100KB 的数据并写入临时文件;然后由另一个程序读出并统计
我想加快编译速度,所以我想我可以在 ramdisk 上构建我的文件,但也可以将它自动刷新到文件系统,并在没有足够 ram 的情况下使用文件系统。 对于我正在编写的应用程序,我可能需要类似的东西,我希望
在尝试跟随 Tweaking the Android Emulator 时要在模拟器上本地包含 Scala 库,我无法加载自定义 ramdisk 镜像。似乎忽略了 emulator -ramdisk
如何使用 mmap 在虚拟 ramdisk 中保留内存?假设我愿意: mkdir /mnt/ramdisk mount -t tmpfs -o size=10m tmpfs /mnt/ramdisk
假设我有两个相同的 10MB 二进制可执行文件副本,A 和 B。 如果我有足够的可用内存并运行 ./A,我的理解是 A 将被加载到内存中并从那里运行。这将需要大约 10MB 的 RAM 才能完成。 如
是否可以通过某种方式在不安装 ramdisk 的情况下创建并使用文件填充 ramdisk 镜像? 我有一套为 linux 定制的文件(所以,只是一堆文件),它们应该在文件系统中。现在我想让它在生成 r
我是文件系统的新手,我想问一下,有没有什么方法可以使用 ram 磁盘文件系统将我的文件保存到辅助内存? 最佳答案 如果你想在 ramdisk 文件系统中保存任何文件,你必须将你的文件系统分区链接到根文
在我的公司,我们目前正在研究加快 CI 构建速度的各种策略。我们已经分析了我们的构建,并确定我们受到 I/O 瓶颈的限制。在不久的将来(约 1-2 个月),我们有很多选择来解决这个问题,但我们真的希望
我正在coldfire板M5272C3上进行uclinux移植。现在我有从 RAM 运行的内核,并使用 romfs 作为我的根文件系统。我不清楚一些术语的含义以及何时使用它们...... 请用最简单的
在 docker-compose 中,我们设置了以下卷: volumes: - /var/kafka-data:/var/lib/kafka/data 所以/var/kafka-data将从 /v
我正在处理 android boot.img,它是压缩内核、ramdisk 和 dtb 的组合。我从 uboot 的串行控制台日志中看到有关启动过程的信息,这是触发我好奇心的部分 CPU: Fre
我正在加速使用 MySQL 进行持久性测试的测试套件。我已经更改了 my.cnf 中的 datadir 和 tmpdir 以使用 RAMDisk,如下所示。 datadir = /ru
我在 Linux 中有一个很好的缓存系统,它使用 ramdisk 来缓存图像文件和我网站各个页面的 HTML 输出。 我的网站相当大,缓存所有内容所需的 ramdisk 空间超过 15GB(不包括图像
我正在使用的嵌入式 Linux 系统有一个 4MB 的 ram 磁盘。目前使用 ext2 格式化。似乎即使是空的,也只有大约 50% 的可用空间! 目前,它用于大约 50 个小文件(1 或 2KB),
我有一个关于将 Apache HBase 与 RAMdisk 一起使用的一般性问题。单个表中有大量数据集合,总共约 25GB。有了这些数据,我正在使用 Java 程序进行一些基本的聚合。 因为我有足够
我正在编写一些软件,需要将数据从分层格式扁平化为表格格式。我不想每次都用一种编程语言来完成并提供服务,而是想将结果缓存几秒钟,然后使用 SQL 进行排序和过滤。在使用时,我们说的是在那几秒钟内进行 4
我正在尝试将我的 php session 保存在 ramdisk 上。我有权限问题,但我看不出问题出在哪里。 我有虚拟磁盘: /dev/ram0 407M 2.4M 404M 1%/var/lib/p
是否可以在 Android 框架启动之前,但在底层 Linux 内核启动之后,在 Android 中挂载 ramdisk?如果是这样,我应该使用什么命令? 谢谢! 最佳答案 根据我看过的一些引用书,一
我是一名优秀的程序员,十分优秀!