压缩阻塞文件中的记录的好算法是什么?

2023-12-06

假设您有一个由一堆固定大小的块组成的大文件。每个块都包含一定数量的可变大小的记录。每条记录必须完全适合单个块,并且根据定义,此类记录永远不会大于整个块。随着时间的推移,随着记录从这个“数据库”中移入和移出,记录会被添加到这些块中或从这些块中删除。

在某些时候,尤其是在许多记录添加到数据库并删除一些记录之后,许多块最终可能只被部分填充。

有什么好的算法可以打乱数据库中的记录,通过更好地填充部分填充的块来压缩文件末尾不必要的块?

算法要求:

  • 压缩必须发生在原始文件的位置,而不会暂时将文件从其起始大小扩展到最多几个块
  • 该算法不应不必要地干扰已经基本满的块
  • 必须一次从文件中读取或写入整个块,并且应该假设写入操作相对昂贵
  • 如果记录从一个块移动到另一个块,则必须将它们添加到新位置,然后再将其从起始位置删除,以便万一操作中断,不会因“失败”压缩而丢失任何记录。 (假设可以在恢复时检测到此类记录的临时重复)。
  • 可用于此操作的内存可能只能是几个块的数量级,这仅占整个文件大小的很小一部分
  • 假设记录大小约为 10 字节到 1K 字节,平均大小可能为 100 字节。固定大小的块约为 4K 或 8K,文件约为 1000 个块。

这听起来像是一个变体装箱问题,但是您已经有了想要改进的较差分配。因此,我建议研究一些成功解决装箱问题的方法的变体。

首先,您可能想通过定义您认为“足够满”(块足够满以至于您不想碰它)和“太空”(块有如此多的空白空间以至于必须添加更多记录)。然后,您可以将所有块分类为足够满、太空或部分满(那些既不够满也不太空的块)。然后,您将问题重新定义为如何通过创建尽可能多的足够满的块,同时最小化部分满的块的数量来消除所有太空的块。

您还需要弄清楚什么更重要:将记录放入尽可能少的块中,或者将它们充分打包,但读取和写入的块数量最少。

我的方法是对所有块进行初始遍历,将它们全部分类到上面定义的三个类别之一。对于每个块,您还希望跟踪其中的可用空间,对于太空的块,您需要获得所有记录及其大小的列表。然后,从太空的块中最大的记录开始,将它们移动到部分满的块中。如果您想最大程度地减少读取和写入,请将它们移动到内存中当前拥有的任何块中。如果您想最大程度地减少浪费的空间,请找到仍可保存记录的空白空间最少的块,并在必要时读取该块。如果没有块可以保存记录,则创建一个新块。如果内存中的块达到“足够满”阈值,请将其写出。重复此操作,直到部分填充的块中的所有记录都已放置完毕。

我跳过了很多细节,但这应该可以让您有所了解。请注意,装箱问题是NP-hard,这意味着对于实际应用,您需要决定什么对您最重要,因此您可以选择一种方法,在合理的时间内为您提供近似最佳的解决方案。

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

压缩阻塞文件中的记录的好算法是什么? 的相关文章

  • CFdump cfcomponent cfscript

    可以在 cfcomponent 中使用 cfdump 吗 可以在 cfscript 中使用 cfdump 吗 我知道 anser 不是 那么如何发出 insde cfcomponent 函数的值 cf脚本 我用的是CF8 可以在 cfcom
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro
  • 如何从日期中查找该月的最后一天?

    如何在 PHP 中获取该月的最后一天 Given a date 2009 11 23 我要2009 11 30 并给出 a date 2009 12 23 我要2009年12月31日 t返回给定日期所在月份的天数 请参阅的文档date ht
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接
  • 从超立方体图像中获取文本的确切位置

    使用 tesseract 中的 GetHOCRText 0 方法 我能够检索 html 中的文本 并在 webview 中呈现 html 时 我能够获取文本 但图像中文本的位置与输出不同 任何想法都非常有帮助 tesseract gt Se
  • Vue.js[vuex] 如何从突变中调度?

    我有一个要应用于 json 对象的过滤器列表 我的突变看起来像这样 const mutations setStars state payload state stars payload this dispatch filter setRev
  • CSS溢出文本显示在几行中,没有断字

    我有一些长文本显示在 div 中 该 div 具有固定的宽度和高度 我希望文本显示在几行上 作为 div 高度 并且句子单词不会中断 一行中的单词前缀和下一行中的继续 此外 我想在末尾添加省略号最后一句话 CSS white space n
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个
  • 循环内的异步性

    我正在使用 jQuery getJSON 用于从一组实用程序的给定 URL 检索数据的 API 我真的很想找到一种为每个实用程序重用代码 完全相同 的方法 由于循环的执行与 ajax 调用无关 因此我无法找到保留循环值的方法 我知道这个描述
  • 用于验证目的的动态查找方法

    我正在使用 Ruby on Rails 3 0 7 我想在运行时查找一些记录以进行验证 但为该查找方法传递 设置一个值 也就是说 在我的班级中 我有以下内容 class Group lt lt ActiveRecord Base valid
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe
  • Erlang dict的时间复杂度

    我想知道 Erlang OTP 是否dict模块是作为哈希表实现的 在这种情况下它是否能提供这样的性能 平均情况 Search O 1 n k Insert O 1 Delete O 1 n k 最坏的情况下 Search O n Inse
  • 在 Nexus 7 2013 上更改方向时 CSS 媒体查询不起作用

    我目前正在我的笔记本电脑 台式电脑和 Nexus 7 2013 上测试 CSS 媒体查询 除了 Nexus 7 之外 它们在台式机和笔记本电脑上都运行良好 当我更改方向时 除非刷新页面 否则样式不会应用 例如 以纵向模式握住设备时 页面正常
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points
  • 强制 Listview 不重复使用视图(复选框)

    我做了一个定制Listview 没有覆盖getView 方法 Listview 中的每个项目都具有以下布局 联系布局 xml

随机推荐

  • Pandas:如何创建一个简单的计数器来增加每 n 行?

    有没有办法创建一个每 n 行加一的计数器 示例 gt 计数器每 4 行增加 counter 0 1 1 1 2 1 3 1 4 2 5 2 6 2 7 2 8 3 9 3 我正在尝试df counter np arange len df 4
  • 如何控制绑定到 CustomObject 的 DataGridView 中的列类型?

    我在 C WinForms 应用程序中有一个 DataGridView 它在运行时 通过 Form Load 数据绑定到自定义对象 在 DataGridView 的设计视图中 我没有设置列 当表单加载时 将根据数据绑定到的自定义对象中的数据
  • 有负零吗?

    我正在编码简单的计算器只是为了开始 iPhone 开发 问题是我有一个 按钮 它应该通过执行一个简单的操作来否定已经放在屏幕上的任何内容 1 它工作正常 除非先前的输入是0 设想 屏幕空白或0 我点击 进行否定 然后当我点击例如9我希望它能
  • Java 中带有参数的高效 XSLT 管道

    这个问题的最佳答案描述了一种在 Java 中实现高效 XSLT 管道的技术 Java 中的高效 XSLT 管道 或将结果重定向到源 不幸的是 虽然 Transformer 似乎公开了一个用于设置 XSLT 参数的 API 但这似乎没有任何效
  • 如何使用 Jest 测试 asnyc 代码(或使用 jsdom 测试“image.onload”)

    编辑 我已经用 Promise 方式更改了我的代码 我正在写反应this由facebook创建的starter 我是测试方面的新手 现在我有一个关于图像的组件 它有一个检查图像大小的功能 import React Component fro
  • Drupal 7 Views - 按字段列出组

    我有一个列出类型内容的视图Bio 人物传记 但是 我想对其进行格式化 以便将它们分组在不同的标题下 我添加了一个新字段Bios内容类型是一个包含三个不同选项的下拉列表 Foo Bar and Baz 我想做的是将人员显示在各自组的标题下 现
  • 当视图使用主布局时,MVC 4 \ 表单提交按钮不起作用

    ok 经过长时间的调查 似乎当我创建一个与 layout cshtml 一起使用的视图时 我所拥有的表单中的提交按钮不起作用 没有任何操作返回到控制器 仅当我创建视图并取消选中 使用布局或母版页 时 该按钮才起作用 这看起来非常不清楚 所以
  • 如何使用 Spring RestTemplate 将列表或字符串数​​组传递给 getForObject

    我正在用 Spring 开发一些宁静的服务 我在将字符串数组或大字符串作为参数传递 获取到服务控制器时遇到问题 我的代码示例如下 控制器 RequestMapping value getLocationInformations pointL
  • HttpClient 订阅的响应标头未定义

    谁能告诉我为什么在从 http post 获取响应时没有收到任何标头的原因 this http post
  • 版本 5.5.4+ 中的 ItextSharp 字体颜色问题

    我有一些代码使用红色字体颜色创建红色 图章 string StampDate DateTime Now ToString MM dd yyyy string FontPath Server MapPath assets Fonts stri
  • 使用 Hadoop 版本 2.7.2 从 Spark 使用 S3a 协议访问 S3

    我正在尝试从 pyspark 版本 2 2 0 访问 s3 s3a 协议 但遇到了一些困难 我正在使用 Hadoop 和 AWS sdk 软件包 pyspark packages com amazonaws aws java sdk pom
  • OSMDroid:onTap 示例

    几周前我开始学习 Android 现在我需要你的帮助 我的任务是创建离线地图 使用 OSMDroid 和 Mobile Atlas Creator 上面有两个标记 它们之间的路径以及单击此标记后的一些活动 我已经做好了地图 标记和路径 这是
  • 如果缓存文件夹中不存在文件,则重写 htaccess

    我想检查缓存文件夹中是否不存在文件 然后将其重新连接到 php 文件 RewriteCond DOCUMENT ROOT cache 0 f NC RewriteRule jpg png gif css js include cache o
  • geodjango中按距离排序的效率如何(整个表)

    假设我有以下数据模型 Person models Model id models BigAutoField primary key True name models CharField max length 50 location mode
  • minSDK 低于 11 的 Android 设备上的 Google 地图 v2

    当我创建使用 Google 地图 API v2 的项目时 我遇到了这一行的问题 GoogleMap 地图 MapFragment getFragmentManager findFragmentById R id map getMap 据说我
  • ObjectListView 显示图标

    尝试将图标放入 ObjectListview 中 这是我应该放置图标的代码 objectListView1 SmallImageList imageList1 deleteColumn IsEditable true deleteColum
  • 使用 extjs 4 嵌套网格

    我可以将网格放入另一个网格的插件中 这是我的网格 我想放入配置 插件 扩展网格 var grid new Ext grid GridPanel store store columns header Customer Name dataInd
  • 是否可以在javascript中取消打印

    我正在使用这里找到的代码 检测浏览器打印事件检测用户是否想要打印该页面 到目前为止 它按预期工作 在 afterPrint 函数中 我调用一个函数 该函数创建并附加一个 iframe 其中包含另一个页面 该页面具有不同的 对需要打印的内容更
  • scanf 跳过所有直到出现字符串

    是否可以使用 scanf 跳过所有字符 直到到达特定字符串 我有一个 html 文件 我想跳过此字符串之前的所有字符 包括该字符串 h2 a href a href a a h2
  • 压缩阻塞文件中的记录的好算法是什么?

    假设您有一个由一堆固定大小的块组成的大文件 每个块都包含一定数量的可变大小的记录 每条记录必须完全适合单个块 并且根据定义 此类记录永远不会大于整个块 随着时间的推移 随着记录从这个 数据库 中移入和移出 记录会被添加到这些块中或从这些块中