下面是我自己写的代码,但在海量数据计算中时间太长,想请高手们帮忙看能不能再优化一下,或者换种算法都行,只求提高运算速度
结果要求:数组中每一个字符串都是"0","1","3",总长度为了14位,要求把原来每一位中如果是0时就改成1和改成3生成两个新的字符串,例:原字符串"01301301301303 "结果:"11301301301303 ","31301301301303 ","00301301301303 ","03301301301303 "..........每一位改变后生成新字符串,最后的数据不能有重复.
- VB.NET code
Dim s1, s3 As Integer s3 = TNN集.Length - 1 Dim dict As New Dictionary(Of String, Short) '新的 Dictionary类 For Each ii As String In TNN集 If Not dict.ContainsKey(ii) Then dict.Add(ii, 14) '是否含有 i的健值 Next Dim i As String For s1 = 0 To s3 Application.DoEvents() '========================================================= Dim TS() As Char = TNN集(s1).ToCharArray '把每条单式拆分成字符数组 For s2 As Short = 0 To 13 Select Case TS(s2) Case "3" TS(s2) = "1" '改变每位值 i = New String(TS) If Not dict.ContainsKey(i) Then dict.Add(i, 14) '是否含有 i的健值 TS(s2) = "0" i = New String(TS) If Not dict.ContainsKey(i) Then dict.Add(i, 14) '是否含有 i的健值 TS(s2) = "3" Case "1" TS(s2) = "3" '改变每位值 i = New String(TS) If Not dict.ContainsKey(i) Then dict.Add(i, 14) '是否含有 i的健值 TS(s2) = "0" i = New String(TS) If Not dict.ContainsKey(i) Then dict.Add(i, 14) '是否含有 i的健值 TS(s2) = "1" Case "0" TS(s2) = "1" '改变每位值 i = New String(TS) If Not dict.ContainsKey(i) Then dict.Add(i, 14) '是否含有 i的健值 TS(s2) = "3" i = New String(TS) If Not dict.ContainsKey(i) Then dict.Add(i, 14) '是否含有 i的健值 TS(s2) = "0" End Select Next Erase TS Next Return dict.Keys.ToArray dict = Nothing GC.Collect() GC.WaitForPendingFinalizers()
------解决方案--------------------
1。考虑多线程操作,一个读,一个写,写线程负责转换。因为文件的io操作远慢于字符串的创建。而如果是海量数据,读取,写入的优化对整体效率非常明显,可以考虑分块读取的方式对读取优化,在写入的时候可以直接写入,并分开2个线程实现。
2.海量数据的话,不要都放在内存中,内存分配在数据量大的时候对效率的影响非常明显。
------解决方案--------------------
你没有明白我的意思
dim a(4782970) As BitArray
dim T as int32
T=3进制To10进制(01301301301303)
a(t)=ture
这样无需查询,不会有重复项目。
取出来的时候只需要
FOR I = 0 TO 4782969
IF A(I)=TURE THEN 值=10进制to3进制(i)
next I
------解决方案--------------------
并且,你用List还有一个重要好处
由于你的效率主要卡在contains这个方法这里,所以你要避免这个方法
你在添加字符串的时候,不要判断contains,就直接添加
然后最后给list调用distinct方法一次性过滤重复的字符串(微软的代码绝对要比你自己写的代码效率高得多)
如果你担心会造成内存占用过大,那么可以阶段性地调用distinct,比如每运行1000条就调用一次