我需要使用C#.Net访问一些文本文件(记录)。但问题是那些文件大于1GB。 (最小尺寸为1 GB)
我应该怎么做? 我需要关注哪些因素?
有人可以给我一个想法来解决这种情况。
编辑:
感谢您的快速回复。是的,它们是固定长度的记录。这些文本文件来自本地公司。 (上个月的交易记录)
是否可以像普通文本文件一样访问这些文件(使用普通文件流)。
和
内存管理怎么样????
答案 0 :(得分:4)
扩展CasperOne的答案
简单地说,没有办法可以一次性将100GB文件可靠地存入内存。在32位机器上,没有足够的寻址空间。在64位计算机中,有足够的寻址空间,但在实际将文件存入内存所需的时间内,您的用户将会因为挫折而终止您的进程。
诀窍是逐步处理文件。基本System.IO.Stream()类用于处理不同数量的变量(可能是无限)流。它有几种Read方法,只能在流中向下进行特定的字节数。您需要使用这些方法来划分流。
我无法提供更多信息,因为您的方案不够具体。您能否从文件中提供更多详细信息或记录分隔符或一些示例行?
<强>更新强>
如果它们是固定长度的记录,那么System.IO.Stream将正常工作。您甚至可以使用File.Open()来访问底层的Stream对象。 Stream.Read有一个重载,它请求从文件中读取的字节数。由于它们是固定长度的记录,因此适用于您的场景。
只要不调用ReadAllText()而使用采用显式字节数组的Stream.Read()方法,内存就不会成为问题。底层Stream类会注意不要将整个文件放入内存(当然,除非你要求它:))。
答案 1 :(得分:2)
您没有具体列出您需要克服的问题。一个文件可以是100GB,你可以毫无问题地处理它。
如果你必须整个处理文件那么这需要一些创意编码,但如果你可以一次只处理文件的各个部分,那么它相对容易移动到您需要开始的文件中的位置,处理您需要以块为单位处理的数据,然后关闭该文件。
这里的更多信息肯定会有所帮助。
答案 2 :(得分:0)
您目前遇到的主要问题是什么?要记住的重要一点是要根据流进行思考 - 即尽可能保留内存中的最小数据量。 LINQ非常适合处理序列(尽管您需要避免一些缓冲操作,例如OrderBy)。
例如,here's一种有效处理大文件中简单记录的方法(注意迭代器块)。
要对文件中的大数据执行多次聚合/分析,请考虑Push LINQ中的MiscUtil。
您可以为您正在考虑的问题添加更多上下文吗?
答案 3 :(得分:0)
扩展JaredPar的答案。
如果文件是二进制文件(即整数存储为4个字节,固定长度字符串等),则可以使用BinaryReader类。比拉出n个字节然后试图查询它更容易。
另请注意,System.IO.Stream上的read方法是非阻塞操作。如果你要求100个字节,它可能会返回少于100个字节,但仍然没有达到文件末尾。
BinaryReader.ReadBytes方法将阻塞,直到它读取所请求的字节数或文件结尾 - 这是首先出现的。
很好的合作伙伴:)
答案 4 :(得分:0)
嘿伙计们,我意识到这篇文章有一段时间没有被触及过,但我只是想发布一个解决你问题的网站。
希望它有所帮助!
-CJ