【问题标题】:Use List<T> in Virtual Memory or Memory Map File [closed]在虚拟内存或内存映射文件中使用 List<T> [关闭]
【发布时间】:2021-07-15 10:21:47
【问题描述】:

我有 46 GB TXT 文件

我需要删除重复和其他方法

我认为需要加载到内存中并且没有足够的可用空间...

任何人有办法将 46 GB TXT 文件作为 List&lt;T&gt;object 加载到 4GB RAM 上作为虚拟内存或内存映射文件吗?

不需要速度或性能!

【问题讨论】:

  • 文本文件的结构是什么? “和其他方法”是什么意思?您是要删除重复的 lines 还是其他内容?您预计会有多少个重复项?我们需要更多背景信息才能真正为您提供帮助...
  • 如果速度不是问题,但 RAM 非常有限,那么为什么不使用常规文件 IO 做所有事情呢?
  • 我想删除List&lt;T&gt;的重复行和其他功能
  • 我只需要使用磁盘中的对象而不是内存这是我的问题的目的
  • @GoodNightNerdPride - 如果他们相同?您现在知道至少有两行哈希相同,但在您的方案下,您最多只能记住其中一个,所以当您下次遇到相同的哈希时......

标签: c# virtual-memory memory-mapped-files


【解决方案1】:

以随机访问方式打开文件,但按顺序读取。每当您读取整行时,计算该行的哈希码,并检查您是否已经计算过该哈希码。将哈希码与行的文件偏移量一起存储在MultiValueDictionary 中(哈希码作为键,文件偏移量作为值)。因此,每当您读取新行并计算其哈希码时,您都会检查您是否已经拥有哈希码。如果你有它,那么你还必须验证行是否与字节匹配(并且你有前几行的一个或多个文件偏移量,因此如果这些行中的一个与当前行逐字节匹配,那么你有一个重复)。

如果您有重复的行,请继续阅读。如果您有新行,则将该行写入新文件中。这个新文件最后将只包含唯一的行。

您必须记住原始文件的进度,因为您会来回走动。返回比较旧行,再读新行。

【讨论】:

  • 同时有同样的想法^^ 但是不需要MultiValueDictionary。只需使用常规字典并存储首先找到的行的文件位置。节省一些内存。
  • @good 假设我们有三个具有相同哈希码的不同行。当遇到第三行时,您必须将其与前两行进行比较。所以你必须知道它们的偏移量。
  • 当然!傻我?
  • @GoodNightNerdPride 感谢您重播,这是个好主意,我会测试他,但我说“其他方法”重复删除器是问题的一部分,我需要随机化行并向他添加其他 List&lt;T&gt; 并合并他和其他工作......对于这个项目的工作,我 100% 需要虚拟内存或内存映射文件对象才能更好地快速使用......
  • @MGToken 您不需要内存映射文件,因为您不能将内存映射文件视为列表,因此对您没有帮助。无论您需要执行什么操作,都可以通过处理文件的偏移列表来完成。随机化是通过简单地打乱列表来完成的。如果您有多个文件,则偏移量还应包括一些标识源文件的方法。
猜你喜欢
  • 2015-09-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 2021-09-22
  • 1970-01-01
相关资源
最近更新 更多