【发布时间】:2018-10-29 02:18:05
【问题描述】:
我有这个代码
//N = 32;
//B = 27;
using (FileStream fs = File.Open(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
using (BinaryReader br = new BinaryReader(fs))
{
using (BinaryWriter bw = new BinaryWriter(fs))
{
for (int k = B; k < N; ++k)
{
Console.WriteLine(k);
long pt = 0;
long j = 1L << k;
for (long i = 0; i < (1L << (N - 1)); ++i)
{
long b1;
long b2;
br.BaseStream.Seek(8 * (pt), SeekOrigin.Begin);
b1 = br.ReadInt64();
br.BaseStream.Seek(8 * (j - 1), SeekOrigin.Current);
b2 = br.ReadInt64();
long t1 = b1 + b2;
long t2 = b1 - b2;
bw.BaseStream.Seek(8 * (pt), SeekOrigin.Begin);
bw.Write(t1);
bw.BaseStream.Seek(8 * (j - 1), SeekOrigin.Current);
bw.Write(t2);
pt += 1;
if ((pt & (j - 1L)) == 0)
{
pt += j;
}
if ((i % 100000) == 0) Console.WriteLine(i);
}
}
}
}
}
发生的情况是,程序从一个非常大 (17 GB) 文件中的不同位置读取两个 long,添加/减去它们,然后在相同位置重写新值。
据我所知,读取数据的最有效方法是将大块读取到缓冲区中,然后使用它。但是,这种方法在这里不起作用,因为根据 pt 和 j 的值,它可以从文件的开头和结尾读取,当然我无法将所有 17 GB 存储在内存中。
线
if ((i % 100000) == 0) Console.WriteLine(i);
用于调试,在我的计算机上它们之间大约 2 秒。我需要这个更快。我正在关注的论文说,他们的实现在这个循环中花费了不到 30 分钟。有没有更快的方法来快速读取大量数值数据?
【问题讨论】:
-
停止向控制台写入时会发生什么?
-
此操作的主要部分将是磁盘操作。数据要么在内存中,要么必须从磁盘读取。您可以尝试将其留给磁盘缓存,但它们也会因两个 17 GiB 文件而负担过重。磁盘非常缓慢。唯一可能较慢的是网络。
-
我可以肯定地说有一种更快的方法来做你正在做的事情。但是,如果没有法医逐行检查您的代码,和/或理解或猜测您要解决的实际问题是什么,以及您拥有的神奇数字是什么,除了说“是”之外,不可能给您任何建议可能可以加快速度
-
@RichardHubley: 1) 虽然我同意实际写入控制台可能很昂贵,但这并不是 2 秒的成本。 2)他已经说过它只是为了调试。 3) 这是磁盘操作。没有很多其他事情会与这些相关。
标签: c# io binaryfiles binary-data