示例#1
0
            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;
            }
示例#2
0
 public void CopyFrom(OrderedSeq other)
 {
     data     = other.data;
     fromPos  = other.fromPos;
     toPos    = other.toPos;
     set1     = other.set1;
     set2     = other.set2;
     fromFile = other.fromFile;
 }
示例#3
0
        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; }
示例#4
0
            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);
            }
示例#5
0
        private static bool FromFile(string fileName, int ioSize, OrderedSeq rest)
        {
            OrderedSeqFromFile fromFile = new OrderedSeqFromFile(fileName, ioSize);

            return(fromFile.GetRest(rest));
        }
示例#6
0
 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;
 }
示例#7
0
 public void CopyFrom(OrderedSeq other)
 {
     data = other.data;
     fromPos = other.fromPos;
     toPos = other.toPos;
     set1 = other.set1;
     set2 = other.set2;
     fromFile = other.fromFile;
 }
示例#8
0
 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;
 }
示例#9
0
        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();
            }
        }
示例#10
0
        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);
            }
        }
示例#11
0
 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);
     }
 }
示例#12
0
 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;
 }
示例#13
0
 private static bool FromFile(string fileName, int ioSize, OrderedSeq rest)
 {
     OrderedSeqFromFile fromFile = new OrderedSeqFromFile(fileName, ioSize);
     return fromFile.GetRest(rest);
 }