我有一个 .txt 文件,其中包含 Pi 的 5 亿位二进制表示。
我需要在我的程序中使用它的字符串表示。我还需要能够在其中搜索子字符串等 - 换句话说,我需要能够将其视为正常大小的字符串。我将尝试找到很多的子串,所以速度是必要的。
我最初的逻辑是简单地将字符串直接复制并粘贴到程序中并将其用作静态变量。但是我无法真正打开 .txt 文件,因此我无法复制和粘贴。我的下一次尝试是从文件中读取整个字符串,但我不能用静态方法执行此操作,而且它花费了 WAAAY 太长的时间(实际上我不知道到底需要多长时间,我最终关闭了程序)。
这有可能吗?任何帮助将不胜感激。
编辑:可能相关的信息:
使用这段代码:
/// <summary>
/// Gets a 500 million binary digit representation of Pi.
/// </summary>
public static string GetPi()
{
//as per http://msdn.microsoft.com/en-us/library/db5x7c0d.aspx
StreamReader piStream = new StreamReader(@"C:\binaryPi.txt");
string pi = "";
string line;
while ((line = piStream.ReadLine()) != null)
{
pi += line;
}
return pi;
}
我得到一个 OutOfMemoryException.. 所以扫描文件实际上似乎是不可能的,除非我遗漏了什么..
最佳答案
我建议您创建一个可以处理此类数据的自定义类。
如果文件的内容是 pi 的二进制形式的表示,那么它只是零和一。如果将每个位存储为实际位,则每个二进制数字使用一个字节的 1/8,而如果将其存储为文本,则每个位将使用两个字节。通过以更紧凑的形式存储,您将使用 1/16 的内存。
然后您的类将必须处理您如何在数据中搜索位模式。这将是棘手的部分,但如果您创建八个不同版本的搜索模式,移动以匹配一个字节中的八个可能位置,则搜索可能比在字符串中搜索更有效。
编辑:
这是一个开始...
public class BitList {
private byte[] _data;
private int _count;
public BitList(string fileName) {
using (FileStream s = File.OpenRead(fileName)) {
_data = new byte[(s.Length + 7) / 8];
_count = 0;
int len;
byte[] buffer = new byte[4096];
while ((len = s.Read(buffer, 0, buffer.Length)) > 0) {
for (int i = 0; i < len; i++) {
switch (buffer[i]) {
case 48: Add(0); break;
case 49: Add(1); break;
}
}
}
}
}
public void Add(int bit) {
_data[_count / 8] |= (byte)(bit << (_count % 8));
_count++;
}
public int this[int index] {
get {
return (_data[index / 8] >> (index % 8)) & 1;
}
}
}
(注意:此代码未经测试,但您至少应该了解原理。)
关于c# - 如何在我的程序中使用非常大的字符串(5 亿个字符)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11282727/