2012-11-17 2 views
2

VS 2010에서는 큰 목록의 문자열이 있고 목록의 각 항목에는 문자열 목록도 포함됩니다 (더 이상 설명하지 않습니다). 좋은 점은 추가 작업 만 수행된다는 것입니다. 목록에서 아무 것도 제거되지 않습니다.리스트를 파일에 저장하는 가장 효율적인 방법은 무엇입니까?

데이터베이스를 사용하고 싶지 않습니다. 목록이 꽤 커질 수 있기 때문에 XML은 나에게 느린 것처럼 보였다. 내 사건에 대한 일반적인 해결책을 찾지 못했습니다. 어떤 생각?

편집 : 좋아요, 일부 코드는 분명히 추측 할 수 있습니다.

Class Word 
    Public theWord As String 
    Public SubWords As New List(Of SubWord) 
    Public Count As Integer = 1 
    Sub New(ByRef Word As String) 
     theWord = Word 
    End Sub 
    Public Sub AddSubWord(ByRef Word As String) 
     Dim SubWordCount As Integer = SubWords.Count - 1 
     Dim Found As Boolean 
     For i = 0 To SubWordCount 
      If SubWords(i).theWord = Word Then 
       SubWords(i).Count += 1 
       Found = True 
       Exit For 
      End If 
     Next 
     If Found = False Then 
      SubWords.Add(New SubWord(Word)) 
     End If 
    End Sub 
    Public Overrides Function ToString() As String 
     Return theWord 
    End Function 
End Class 

Class SubWord 
    Public theWord As String 
    Public Count As Integer = 1 
    Sub New(ByRef Word As String) 
     theWord = Word 
    End Sub 
    Public Overrides Function ToString() As String 
     Return theWord 
    End Function 
End Class 

또한 내가 가지고있는 목록입니다 :

Dim Words As New List(Of Word) 

목적은 그것의 수를 증가하지 않을 경우 단어가 목록에없는 경우 목록에 단어를 추가하는 것입니다. 서브 워드와 동일합니다. 나중에 모든 목록은 개수에 따라 정렬됩니다. sooooo 많은 단어와 각 그들에 대한 거대한 하위 단어 목록이있을 것입니다.

+1

이 더 범위를 좁힐하지 않는 의미 "효율적인"입니다. 또한 직렬화에는 속도, 크기, 순방향 호환성 등 여러 가지 중요한 고려 사항이 있습니다. 후자는 어떻습니까? – Jon

+0

질문이 업데이트되었습니다. – theGD

+0

List 을 사용하지 않은 주요 이유가 있습니다. 포함 할 항목은 무엇입니까? 목록을 얼마나 자주 그리고 얼마나 오래 기억해야 하는가?로드 및 저장에 걸리는 시간은 "효율적인"측면에서 관련 이슈입니다. –

답변

1

XML이 최상의 옵션 인 것처럼 보이지만 효율성에 대해 정말로 염려하고 미래에 데이터 구조가 변경되지 않는다고 확신하는 경우 데이터를 구분 된 텍스트 파일에 저장할 수 있습니다.

Private Sub SaveList(filePath As String, list As List(Of List(Of String))) 
    Const fieldDelimiter As String = "," 
    Const recordDelimiter As String = Environment.NewLine 
    Dim temp As New List(Of String)() 
    For each i as List(Of String) in list) 
     temp.Add(String.Join(fieldDelimiter, i.ToArray())) 
    Next 
    Dim contents As String = String.Join(recordDelimiter, temp.ToArray()) 
    File.WriteAllText(filePath, contents) 
End Sub 

또는 더 효율적으로 : 예를 들어

Private Sub SaveList(filePath As String, list As List(Of List(Of String))) 
    Const fieldDelimiter As String = "," 
    Const recordDelimiter As String = Environment.NewLine 
    Using writer As New StreamWriter(filePath) 
     Dim firstRecord As Boolean = True 
     For Each record as List(Of String) In list) 
      If firstRecord Then 
       firstRecord = False 
      Else 
       writer.Write(recordDelimiter) 
      End If 
      Dim firstField As Boolean = True 
      For Each field As String In record 
       If firstField Then 
        firstField = False 
       Else 
        writer.Write(fieldDelimiter) 
       End If 
       writer.Write(field) 
      Next 
     Next 
    End Using 
End Sub  
이 방법의 단점은 당신이 결코 사용하지 구분자가 어떤에서 모든 필드 내에서 발생하는 것을 확인해야한다는 것입니다

기록들. 문자열에 특정 비정상적인 문자가 포함되지 않는다는 것을 알고 있다면 그냥 사용할 수 있습니다. 그렇지 않으면, 대안은 어커런스를 벗어나는 것입니다. 예를 들어 쉼표를 구분 기호로 사용할 경우 ,의 모든 항목을 \,으로 바꾼 다음 \의 모든 항목을 \\으로 바꿔야합니다. 물론 이것은 저장 논리뿐만 아니라 로딩 논리도 복잡하게 만듭니다.

UPDATE

속도가 주요 관심사입니다, 당신은 단어와 Subwords 모든 미만 100 자 읽기의 다음 가장 빠른 방법이 될 것이라는 점을 보장 할 수있는 데이터를 기록하는 각 단어를 작성하는 것입니다 경우 텍스트 파일의 새 행에 고정 폭 필드를 사용하는 각 하위 단어가옵니다. 다섯의 최대 길이가 있다면 예를 들어, 파일은 다음과 같이 보일 수 있습니다

Word Sub1 Sub2 
W2 SW1 SW2 SW3 
W3 
W4 SubWdSub2. 

당신이 그 예에서 볼 수 있듯이, 네 개의 단어 ("말씀", "W2" "W3가 ","W4 "), 각각 Subwords의 수가 다릅니다. "Word"의 서브 워드는 "Sub1"과 "Sub2"입니다. "W3"에는 Subwords가없고 W4에는 2 ("SubWd"및 "Sub2.")가 있습니다.

그래서, 당신은 같은 것을 할 수있는, 해당 파일을 쓰기 :

Private Sub SaveWords(filePath As String, words As List(Of Word)) 
    Const maxLength As Integer = 100 
    Using writer As New StreamWriter(filePath) 
     Dim firstWord As Boolean = True 
     For Each w As Word in words 
      If firstWord Then 
       firstWord = False 
      Else 
       writer.WriteLine() 
      End If 
      writer.Write(w.theWord.PadRight(maxLength)) 
      For Each s As SubWord In w.SubWords 
       writer.Write(s.theWord.PadRight(maxLength)) 
      Next 
     Next 
    End Using 
End Sub 
+0

정확히 XML이 최상의 옵션으로 보이는 이유는 무엇입니까? 또한이 코드는 불필요하게 낭비입니다. – Jon

+0

@ 존 그가 저장하려고하는 데이터 구조가 단순한 1 차원 목록보다 복잡하기 때문에 나는 XML을 추천했다. XML은보다 유연하여 향후 데이터 구조 변경을보다 쉽게 ​​처리 할 수 ​​있으며 표준이기 때문에 다른 프로그래머가 이해하고 작업하기가 더 쉽습니다. XML이 진지하게 선택 사항이 아닌 한, 좋은 이유가 있지만 너무 느린 것 같아서 제외시키지 않는 것이 좋습니다. –

+0

@ 존 코드의 효율성에 관해서는, 나는 동의한다, 그것은 전혀 최적이 아니다. 필자는 대부분 파일을 생성하는 가장 효율적인 방법이 아닌 형식을 명확하게 보여주기 위해 대부분 노력했습니다. 스트림에 직접 쓰는 것은 분명히 항목 사이에 필요에 따라 구분 기호를 추가하는 것이 훨씬 효율적이지만 그렇게하면 예제가 훨씬 더 복잡해집니다. 네가 맞다고 생각해. 나는 좀 더 효율적인 예제를 추가해야한다. 나는 OP가 어떤 수준의 효율성을 가지고 있었는지 구체적으로 밝히지 않았으므로 충분하다고 생각했다. –

관련 문제