你能读取和删除文件块吗?
Can you read and delete chunk of a file?
我正在使用 ofstream 和 ifstream 从文件中读取块 post 它通过中间件 (DDS) 到另一个进程,另一个进程写入该文件的卡盘。
基本上是传输文件。这两个组件彼此不知道,可能存在于相同的硬件或不同的硬件上(DDS 负责两种方式的传输)。
一切正常,但是当我尝试对大文件 (>500MB) 执行此操作时,如果目标组件在同一块板上,那么我 运行 内存不足(因为 500 x 2 = 1GB,这是我的限制)。
所以我正在考虑从文件中读取一个块,删除该文件块,然后发送该块。所以我最终得到:
A B
12345 ->
2345 -> 1
345 -> 12
45 -> 123
5 -> 1234
-> 12345
其中每个数字都是一个文件块。
我正在使用 linux,因此我可以直接使用任何 linux API,但可能更喜欢纯 C++ 方法。我在这里真的看不到任何好的选择。 i/ostream 似乎不允许您这样做。 sed
之类的选项(我认为)最终会通过复制使用更多内存。
是否有更好的机制来执行此操作?
更新
文件通过 tmpfs
分区
存储在 RAM 中
I am using linux, so I can use any linux APIs directly, but would
probably prefer a pure c++ approach. I can't really see any good
options here. i/ostream does not appear to let you do this. Options
like sed will (I think) end up using more memory by copying.
Are there any better mechanisms for doing this?
在 C++ 或 Linux 中没有通过从开头或中间删除数据来缩短文件 in-place 的标准机制。大多数文件系统无法以支持它的方式工作。当要从这样的位置删除数据时,必须重新复制一份文件,省略要删除的数据。
您可以通过删除尾部来缩短文件,但这不会达到您的目的,除非您以相反的顺序从尾部到头部发送块。但是,我能想到的最自然的方法是在像您这样的应用程序中支持 pre-allocating full-size 目标文件,这将与您试图解决的问题相同。
Can you read ... chunk of a file?
您可以寻找一个偏移量以从文件的任何位置开始读取,并且可以在完全读取该块后停止读取。
Can you ... delete chunk of a file?
操作系统以类似于矢量的界面呈现文件。从文件末尾删除一个块是微不足道的,就像从向量末尾删除元素一样微不足道。您可以简单地使用新大小调用 std::filesystem::resize_file
,新大小是从原始大小中减去的块大小。
从其他地方删除块更复杂。您必须首先寻找到块的开头,然后将块之后的内容复制到块的开头并向前。此操作的复杂性与从块开始到文件末尾的距离成线性关系。复制完所有尾随内容后,您可以调整大小以删除多余内容。
我正在使用 ofstream 和 ifstream 从文件中读取块 post 它通过中间件 (DDS) 到另一个进程,另一个进程写入该文件的卡盘。
基本上是传输文件。这两个组件彼此不知道,可能存在于相同的硬件或不同的硬件上(DDS 负责两种方式的传输)。
一切正常,但是当我尝试对大文件 (>500MB) 执行此操作时,如果目标组件在同一块板上,那么我 运行 内存不足(因为 500 x 2 = 1GB,这是我的限制)。
所以我正在考虑从文件中读取一个块,删除该文件块,然后发送该块。所以我最终得到:
A B
12345 ->
2345 -> 1
345 -> 12
45 -> 123
5 -> 1234
-> 12345
其中每个数字都是一个文件块。
我正在使用 linux,因此我可以直接使用任何 linux API,但可能更喜欢纯 C++ 方法。我在这里真的看不到任何好的选择。 i/ostream 似乎不允许您这样做。 sed
之类的选项(我认为)最终会通过复制使用更多内存。
是否有更好的机制来执行此操作?
更新
文件通过 tmpfs
分区
I am using linux, so I can use any linux APIs directly, but would probably prefer a pure c++ approach. I can't really see any good options here. i/ostream does not appear to let you do this. Options like sed will (I think) end up using more memory by copying.
Are there any better mechanisms for doing this?
在 C++ 或 Linux 中没有通过从开头或中间删除数据来缩短文件 in-place 的标准机制。大多数文件系统无法以支持它的方式工作。当要从这样的位置删除数据时,必须重新复制一份文件,省略要删除的数据。
您可以通过删除尾部来缩短文件,但这不会达到您的目的,除非您以相反的顺序从尾部到头部发送块。但是,我能想到的最自然的方法是在像您这样的应用程序中支持 pre-allocating full-size 目标文件,这将与您试图解决的问题相同。
Can you read ... chunk of a file?
您可以寻找一个偏移量以从文件的任何位置开始读取,并且可以在完全读取该块后停止读取。
Can you ... delete chunk of a file?
操作系统以类似于矢量的界面呈现文件。从文件末尾删除一个块是微不足道的,就像从向量末尾删除元素一样微不足道。您可以简单地使用新大小调用 std::filesystem::resize_file
,新大小是从原始大小中减去的块大小。
从其他地方删除块更复杂。您必须首先寻找到块的开头,然后将块之后的内容复制到块的开头并向前。此操作的复杂性与从块开始到文件末尾的距离成线性关系。复制完所有尾随内容后,您可以调整大小以删除多余内容。