public OrderedSeqFromFile fromFile; //if <> null it's a file stream public void Init(int[] data, int fromPos, int toPos, OrderedSeqFromFile fromFile, OrderedSeq set1, OrderedSeq set2) { this.data = data; this.fromPos = fromPos; this.toPos = toPos; this.set1 = set1; this.set2 = set2; this.fromFile = fromFile; }
public void CopyFrom(OrderedSeq other) { data = other.data; fromPos = other.fromPos; toPos = other.toPos; set1 = other.set1; set2 = other.set2; fromFile = other.fromFile; }
private static bool Merge2Seq(OrderedSeq set1, OrderedSeq set2, OrderedSeq rest) { int i1 = set1.fromPos; int i2 = set2.fromPos; int e1 = set1.toPos; int e2 = set2.toPos; int[] arr1 = set1.data; int[] arr2 = set2.data; int[] temp = rest.data; Debug.Assert(set1 == rest.set1); Debug.Assert(set2 == rest.set2); Debug.Assert(temp != null); Debug.Assert(set1 != set2); Debug.Assert(set1 != rest); Debug.Assert(set2 != rest); int j = 0; loop: if (i1 >= e1) { goto copy_2; } if (i2 >= e2) { goto copy_1; } int v1 = arr1[i1]; int v2 = arr2[i2]; if (v1 < v2) { temp[j++] = v1; i1++; } else { temp[j++] = v2; i2++; } goto loop; copy_1: rest.fromPos = 0; rest.toPos = j; set1.ReplaceWithSubseq(i1, e1); if (!set2.ReplaceWithRest()) { rest.set2 = null; } return(true); copy_2: rest.fromPos = 0; rest.toPos = j; if (!set1.ReplaceWithRest()) rest.set1 = null; }
public bool GetRest(OrderedSeq rest) { mre.WaitOne(); //wait for previous read to complete Param param = parameters[currentParam]; //one should always be available if (param.remaining + param.sz > 0) { rest.Init(param.intBuffer, 0, param.sz, this, null, null); //swap param currentParam = (currentParam + 1) % 2; Param newParam = parameters[currentParam]; newParam.remaining = param.remaining; newParam.sz = 0; ReadAhead(newParam); return(true); } mre.Dispose(); fs.Close(); fs.Dispose(); return(false); }
private static bool FromFile(string fileName, int ioSize, OrderedSeq rest) { OrderedSeqFromFile fromFile = new OrderedSeqFromFile(fileName, ioSize); return(fromFile.GetRest(rest)); }
public bool GetRest(OrderedSeq rest) { mre.WaitOne();//wait for previous read to complete Param param = parameters[currentParam];//one should always be available if (param.remaining + param.sz > 0) { rest.Init(param.intBuffer, 0, param.sz, this, null, null); //swap param currentParam = (currentParam + 1) % 2; Param newParam = parameters[currentParam]; newParam.remaining = param.remaining; newParam.sz = 0; ReadAhead(newParam); return true; } mre.Dispose(); fs.Close(); fs.Dispose(); return false; }
public void CopyFrom(OrderedSeq other) { data = other.data; fromPos = other.fromPos; toPos = other.toPos; set1 = other.set1; set2 = other.set2; fromFile = other.fromFile; }
public void Init(int[] data, int fromPos, int toPos, OrderedSeqFromFile fromFile, OrderedSeq set1, OrderedSeq set2) { this.data = data; this.fromPos = fromPos; this.toPos = toPos; this.set1 = set1; this.set2 = set2; this.fromFile = fromFile; }
private static void ToTextFile(OrderedSeq s, string fileName, int outputLen) { using (StreamWriter w = new StreamWriter(fileName)) { using (ManualResetEvent mre = new ManualResetEvent(true)) { bool flag = true; WriteToFileParam[] parameters = new WriteToFileParam[2]; parameters[0] = new WriteToFileParam(outputLen, w, mre, 0); parameters[1] = new WriteToFileParam(outputLen, w, mre, 1); int currentParam = 0; int[] buffer = parameters[currentParam].buffer; int j = 0; while (flag) { int fromPos = s.fromPos; int finalToPos = s.toPos; while (fromPos < finalToPos) { int sz = Math.Min(outputLen - j, finalToPos - fromPos); int intermToPos = fromPos + sz; for (int i = fromPos; i < intermToPos; i++) { buffer[j++] = s.data[i]; } fromPos += sz; if (j >= outputLen) { //write to file WriteOnThread(parameters[currentParam]); currentParam = (currentParam + 1) % 2; buffer = parameters[currentParam].buffer; j = 0; } } flag = s.ReplaceWithRest(); } if (j > 0) { //write to file parameters[currentParam].len = j; WriteOnThread(parameters[currentParam]); } mre.WaitOne(); parameters[0].w = null; parameters[0].mre = null; parameters[1].w = null; parameters[1].mre = null; } w.Close(); } }
private static void MergeMany(string[] inputFiles, string outputFile, int ioSize, int outputLen) { int len = inputFiles.Length; if (len == 0) { Error("Number of input files has to be larger than 0"); } else if (len == 1) { OrderedSeq rest = new OrderedSeq(); FromFile(inputFiles[0], ioSize, rest); ToTextFile(rest, outputFile, outputLen); } else { OrderedSeq rest = new OrderedSeq(); MergeBy2(inputFiles, 0, len, ioSize, rest); ToTextFile(rest, outputFile, outputLen); } }
private static bool MergeBy2(string[] inputFiles, int fromIdx, int toIdx, int ioSize, OrderedSeq rest) { int len = toIdx - fromIdx; if (len == 0) { Error("internal error"); return false; } else if (len == 1) { return FromFile(inputFiles[fromIdx], ioSize, rest); } else if (len == 2) { OrderedSeq s1 = new OrderedSeq(); OrderedSeq s2 = new OrderedSeq(); FromFile(inputFiles[fromIdx], ioSize, s1); FromFile(inputFiles[fromIdx + 1], ioSize, s2); rest.data = new int[s1.data.Length + s2.data.Length]; rest.set1 = s1; rest.set2 = s2; return Merge2Seq(s1, s2, rest); } else { int mid = fromIdx + len / 2; OrderedSeq s1 = new OrderedSeq(); MergeBy2(inputFiles, fromIdx, mid, ioSize, s1); OrderedSeq s2 = new OrderedSeq(); MergeBy2(inputFiles, mid, toIdx, ioSize, s2); rest.data = new int[s1.data.Length + s2.data.Length]; rest.set1 = s1; rest.set2 = s2; return Merge2Seq(s1, s2, rest); } }
private static bool Merge2Seq(OrderedSeq set1, OrderedSeq set2, OrderedSeq rest) { int i1 = set1.fromPos; int i2 = set2.fromPos; int e1 = set1.toPos; int e2 = set2.toPos; int[] arr1 = set1.data; int[] arr2 = set2.data; int[] temp = rest.data; Debug.Assert(set1 == rest.set1); Debug.Assert(set2 == rest.set2); Debug.Assert(temp != null); Debug.Assert(set1 != set2); Debug.Assert(set1 != rest); Debug.Assert(set2 != rest); int j = 0; loop: if (i1 >= e1) { goto copy_2; } if (i2 >= e2) { goto copy_1; } int v1 = arr1[i1]; int v2 = arr2[i2]; if (v1 < v2) { temp[j++] = v1; i1++; } else { temp[j++] = v2; i2++; } goto loop; copy_1: rest.fromPos = 0; rest.toPos = j; set1.ReplaceWithSubseq(i1, e1); if (!set2.ReplaceWithRest()) rest.set2 = null; return true; copy_2: rest.fromPos = 0; rest.toPos = j; if (!set1.ReplaceWithRest()) rest.set1 = null; set2.ReplaceWithSubseq(i2, e2); return true; }
private static bool FromFile(string fileName, int ioSize, OrderedSeq rest) { OrderedSeqFromFile fromFile = new OrderedSeqFromFile(fileName, ioSize); return fromFile.GetRest(rest); }