c# - 文件中数据段的重新排序

标签 c# java c++ language-agnostic

我正尝试在 C、C++、C#、Java 或任何其他语言中找到一个算法来帮助解决我一直面临的重新排序问题。

目标是获取文件中的一系列范围,并以新模式重新组织,基本上是在不破坏数据完整性的情况下移动数据片段。我更希望找到一个可以就地执行它并使用单个缓冲区进行交换或直接从一个地方移动到另一个地方的缓冲区。只要范围在完成时具有相同的长度和数据完整性,重组过程就可以将范围分解成多个部分。

例如,给定一组值:

  Length    SrcStart     Src End   Dst Start     Dst End
    9178      274054      283231           0        9177
  274051           0      274050        9178      283228
  582929      283229      866157      283229      866157
  399208      874397     1273604      866158     1265365
    8239    14675709    14683947     1265366     1273604
  986980     1273605     2260584     1273605     2260584
  602862     2811144     3414005     2260585     2863446
  138712     4092072     4230783     2863447     3002158
  116210     3414007     3530216     3002159     3118368
  550559     2260585     2811143     3118369     3668927
  561856     3530217     4092072     3668928     4230783
24319165     4230784    28549948     4230784    28549948
  578539    30246149    30824687    28549949    29128487
  491856    28549949    29041804    29128488    29620343
  593580    29639113    30232692    29620344    30213923
  597308    29041805    29639112    30213924    30811231
   13456    30232693    30246148    30811232    30824687
  633513    31407949    32041461    30824688    31458200
  583261    30824688    31407948    31458201    32041461
40117358    32041462    72158819    32041462    72158819

SrcStart -> SrcEnd 范围内的所有内容都需要移动到 DstStart -> DstEnd 范围。请注意,在许多情况下,从 Source 到 Destination 的转换将导致 Destination 的内容发生更改,由于所需的原始数据已被破坏,您无法再从该位置复制这些内容。

目标是将每一段数据从SrcStart移动到DstStart,第一列的长度。每行对应的“结束”就是开始加上长度减一(因此它是实际偏移量)。

我做了很多研究,研究了交换值、分解与其他值交叉的区域以及容器内的容器交换,但它们似乎不足。因此,这让我回到了我的第一个陈述,我希望也许有一种算法或一些来源可以帮助我解决这个问题,而社区的共享知识似乎就是这样去。

谢谢!

最佳答案

您可以使用磁盘碎片整理程序使用的方法。

  • 先将需要覆盖的数据复制到空闲区域
  • 更改任何引用该数据的索引以指向新位置,以便将来使用该拷贝。
  • 如果系统有这种概念,您可能需要注意是否有任何 block 变为“未使用”。

但是,如果索引以字节为单位,则意味着整个文件只有 80 MB。这么小的文件可以很快复制(不到两秒)也许真实的例子要长得多。文件总共有多大?

关于c# - 文件中数据段的重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8450054/

相关文章:

c# - Xml 未正确转换为对象

java - 了解 CheckStyle 检查 "JavadocMethod",属性 "logLoadErrors"

java - 从反射的 Java Class 实例中获取 ClassTag

c++ - 将 invoke_result 与 void 参数类型一起使用?

c++ - less 或 less_equal 使用 set

c++ - 使用 FBX SDK 获取索引

c# - MVVMLight工具箱Messenger类引起问题。射击N次

c# - 如何在 web.config 中设置 session 超时

c# - 与linq的连接查询不同

java - swing 中的图标字体 : font icons not appear in JLabel