【发布时间】:2016-01-04 13:28:02
【问题描述】:
我的任务是重组一个大(~1GB)的二进制文件。我必须得到不同的值 类型并将它们写回一个大文件,转置。这 原始文件是这样的(V代表Value)
V1.1,V2.1,V3.1...VX.1,V1.2,V2.2,V3.2,...VX.2... ...VX.Y
输出文件应如下所示:V1.1,V1.2...V1.Y,V2.1,V2.2...VX.Y.
我现在做的是打开一堆临时文件,全部写V1 进入第一个,所有 V2 进入第二个......一旦我通过原始文件 我连接所有临时文件。
我的限制是:
- 内存(这是最重要的,0 最好)
- 速度(我的任务是尽可能快地做到这一点)
我现在的问题是: - 使用 Filestreams 或 FILE* 时,每个进程限制为 2048 个文件。 该原始文件中可能有超过 2000 个值。 - 使用 CreateFile 非常非常慢。
我如何读取数据: 我知道一个块中有多少个值(即:V1.1 - VX.1 --> X = 1000) 输入文件是一个 ifstream,我将数据读入字节向量, 然后我通过 fwrite() 将每个值写入 FILE*。然后我读了下一个块 V1.2 - VX.2 等等...
我现在的问题是:
有没有办法正确处理这种情况?我知道我将不得不 以某种方式妥协。我怎样才能在不占用太多内存的情况下加快这件事的速度?
提前致谢, 尼古拉斯
编辑:操作系统是 Windows XP Embedded,.NET 4.0 编辑:源文件大小约为 1GB
编辑:我的第一个方法是创建一个骨架文件并用数据填充它 使用 fseek,但这比我目前的方法还要慢。
编辑:程序将在硬盘 RAID-1 设置上运行。
【问题讨论】:
-
对于此类问题,采取利用任何可利用的操作系统特定工具的方法是合理的。不幸的是,当您得知世界上所有计算机上使用的操作系统不止一种时,您可能会感到震惊。因此,如果不说明此处使用的是哪个平台,则不可能给出权威答案。
-
操作系统是 windows,详细 XP Embedded,.NET 4.0
-
fseek可能会有所帮助。因此您只能使用 2 个文件(输入和输出)。 -
您可以创建类似打开文件池的东西。尝试各种策略,了解哪些文件保留在池中(例如最近使用的、最常用的等)
-
我可能会考虑使用当前的、有些稀疏的需求规范来研究
sqlite。更多信息:stackoverflow.com/questions/93654/… 为什么不让其他东西为您组织数据呢?添加所有数据,然后以适合您的方式对数据进行排序的方式查询数据库。至少尝试应该不会花很长时间。
标签: c++