我有一个带有1122 x 1122降水测量矩阵的文本文件.每个测量用4个十进制数字表示.示例行看起来像这样:
0.0234 0.0023 0.0123 0.3223 0.1234 0.0032 0.1236 0.0000 ....
(这1122个值长,1122个线下降.
我需要相同的文本文件,但所有值除以6.(我必须这样做920个文件......)
我设法做到了这一点,但毫无疑问是残忍无效和内存穷举的方式:
我相信有一个更快更专业的方法来做到这一点.我查看了有关Matrix.Divide的无尽网站,但没有看到(或理解)针对此问题的解决方案.任何帮助将不胜感激!这是用于每个文件的代码段:
foreach (string inputline in inputfile)
{
int count = 0;
string[] str_precip = inputline.Split(' '); // holds string measurements
string[] str_divided_precip = new string[str_precip.Length]; // will hold string measurements divided by divider (6)
foreach (string measurements in str_precip)
{
str_divided_precip[count] = ((Convert.ToDouble(measurements)) / 6).ToString("F4", CultureInfo.CreateSpecificCulture("en-US"));
count++;
}
string divline = string.Join(" ", str_divided_precip);
using (System.IO.StreamWriter newfile = new System.IO.StreamWriter(@"asc_files\divfile.txt", true))
{
newfile.WriteLine(divline);
}
}
Run Code Online (Sandbox Code Playgroud)
您打开/关闭每个值的输出,我认为我们可以做得更好!只需将其替换为以下代码:
using (System.IO.StreamWriter newfile = new System.IO.StreamWriter(@"asc_files\divfile.txt", true))
{
foreach (string inputline in inputfile)
{
int count = 0;
foreach (string measurements in inputline.Split(' '))
{
newfile.Write((Convert.ToDouble(measurements) / 6).ToString("F4", CultureInfo.CreateSpecificCulture("en-US")));
if (++count < 1122)
{
newfile.Write(" ");
}
}
newfile.WriteLine();
}
}
Run Code Online (Sandbox Code Playgroud)
对于读取部分,您可能希望一次读取一行,ReadLine()而不是读取一个大块中的整个文件,然后将其拆分到内存中。这种流式传输方法将大大减少内存分配,并且基于硬件(您有多少内存,您的磁盘(HDD?SSD?)有多快)可以以合理的方式提高性能!
请让我知道它现在是如何工作的,我很好奇!
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |