Я хочу выполнить некоторые вычисления для текстового файла, который имеет 1 число "0,1" в каждой строке и имеет почти 1 миллион строк.
То, что я хочу проверить, сколько раз существует последовательность во всем файле, и она делает последовательность в соответствии с sequence length
, например, мой файл:
01100101011 .... до1 миллион (каждое число в новой строке)
код
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
public class Program
{
static void Main(string[] args)
{
Stopwatch time = new Stopwatch();
time.Start();
try
{
// I have hard coded fileName and Sequence Length that i am taking from user
string data = "", fileName = "10.txt"; // this file has almost 1 Million records
int first = 0, last = 0;
// reads data and make a string of that data
// which means "data" = "1001011001010100101 .... upto 1 million"
data = string.Join("", File.ReadAllLines(fileName));
last = Convert.ToInt32("15"); // sequence length
int l = data.Length; // calculates it one time so that dont have to do it everytime
//so why i create List is because sometime Array dont get fully used to its length
// and get Null values at the end
List<string> dataList = new List<string>();
while (first + last < l+1)
{
dataList.Add((data.Substring(first, last)));
first++;
}
// converts list to Array so array will have values and no Null
// and will use Array.FindAll() later
string[] dataArray = dataList.ToArray(), value;
// get rready a file to start writing on
StreamWriter sw = new StreamWriter(fileName.Substring(0, fileName.Length - 4) + "Results.txt");
//THIS IS THE PART THATS TAKING around 40 minutes
for (int j = 0; j < dataArray.Length; j++)
{
// finds a value in whole array and make array of that finding
value = Array.FindAll(dataArray, str => str.Equals(dataArray[j]));
// value.Length means the count of the Number in the whole array
sw.WriteLine(value.Length);
}
sw.Close();
time.Stop();
Console.WriteLine("Time : " + time.Elapsed);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("Exception " + ex.StackTrace);
Console.ReadLine();
}
}
}
Я установил sequence length = 3
, теперь моя программа делает массив:
dataArray = {"011", "110", "100", "001", "010", "101", "011"}
используя String.Substring()
.Теперь я просто хочу вычислить Frequency элемента массива.
Данные в результирующем .txt файле
011 - 2
110 - 0
100 - 0
001 - 0
010 - 0
101 - 0
011 - 2
Теперь это кажется довольно простым, но это не так, я не могу его преобразовать int
, потому что это последовательность, я не хочу терять нули на фронтепоследовательности.
Прямо сейчас моя программа должна зациклить 1 миллион (каждый элемент) X 1 миллион (сравнение с каждым элементом массива) = 1 триллион раз.Это занимает почти 40 минут.Я хочу знать, как я могу сделать это быстро, Parallel.For, TPL Я не знаю о них, как их использовать.Потому что это должно быть сделано за считанные секунды.
Характеристики моей системы
32 ГБ ОЗУ
i7- 5820k 3.30 ГГц
64 бит
2x NVIDIA GTX 970