我需要使用 C#.Net 访问一些文本文件(记录)。但问题是这些文件大于 1GB。(最小大小为 1 GB)
我应该怎么做?我需要关注哪些因素?
有人可以给我一个想法来摆脱这种情况。
编辑:
感谢您的快速回复。是的,它们是固定长度的记录。这些文本文件来自本地公司。(有上个月交易记录)
是否可以像普通文本文件一样访问这些文件(使用普通文件流)。
和
内存管理呢???
我需要使用 C#.Net 访问一些文本文件(记录)。但问题是这些文件大于 1GB。(最小大小为 1 GB)
我应该怎么做?我需要关注哪些因素?
有人可以给我一个想法来摆脱这种情况。
编辑:
感谢您的快速回复。是的,它们是固定长度的记录。这些文本文件来自本地公司。(有上个月交易记录)
是否可以像普通文本文件一样访问这些文件(使用普通文件流)。
和
内存管理呢???
扩展 CasperOne 的答案
简单地说,没有办法一次可靠地将 100GB 的文件放入内存中。在 32 位机器上根本没有足够的寻址空间。在 64 位机器中,有足够的寻址空间,但在实际将文件放入内存中的时间里,您的用户会因为沮丧而终止您的进程。
诀窍是增量处理文件。基础 System.IO.Stream() 类旨在处理不同数量的可变(可能是无限)流。它有几个 Read 方法,它们只会在流中前进特定数量的字节。您将需要使用这些方法来划分流。
我无法提供更多信息,因为您的方案不够具体。您能否提供更多详细信息或您的记录分隔符或文件中的一些示例行?
更新
如果它们是固定长度的记录,那么 System.IO.Stream 就可以正常工作。您甚至可以使用 File.Open() 来访问底层 Stream 对象。Stream.Read 有一个重载,它请求从文件中读取的字节数。由于它们是固定长度的记录,这应该适用于您的场景。
只要您不调用 ReadAllText() 而是使用采用显式字节数组的 Stream.Read() 方法,内存就不会成为问题。底层 Stream 类将注意不要将整个文件放入内存(当然,除非你要求它:))。
您没有具体列出您需要克服的问题。一个文件可以是 100GB,您可以毫无问题地处理它。
如果您必须将文件作为一个整体进行处理,那么这将需要一些创造性的编码,但如果您可以一次只处理文件的各个部分,那么移动到文件中您需要的位置相对容易开始,分块处理需要处理的数据,然后关闭文件。
这里的更多信息肯定会有所帮助。
扩展 JaredPar 的答案。
如果文件是二进制文件(即存储为 4 个字节的整数、固定长度的字符串等),您可以使用 BinaryReader 类。比提取 n 个字节然后尝试询问它更容易。
另请注意,System.IO.Stream 上的读取方法是非阻塞操作。如果您要求 100 个字节,它可能会返回少于该字节数,但仍未到达文件末尾。
BinaryReader.ReadBytes 方法将阻塞,直到它读取请求的字节数或文件结束 - 以先到者为准。
很好的合作小伙子:)
嘿伙计们,我意识到这篇文章已经有一段时间没有被触及了,但我只是想发布一个可以解决您的问题的网站。
希望能帮助到你!
-CJ