質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.52%

.Net Framework Compact 3.5でのCSVファイルからListへの登録を早くしたい

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,433

k47

score 10

お世話になっております。

現在、ハンディターミナルの開発を行っていて、CSVファイルのデータをListに登録したいと考えています。
Listへの登録はできているのですが、時間がかかってしまっているのをどうにかして早くすることは
できないでしょうか?

CSVファイルは、ヘッダー:有、括り:有(")、区切り文字:, 、文字コード:SJIS です。
2つのファイルを連続して読込み、それぞれ別のListに登録しています。
1つ目のファイルは14項目、2つ目のファイルは18項目あり、共に1万5千件のデータ量です。
1つ目のファイルに11秒ほど、2つ目のファイルに35秒ほどかかってしまっています。
これを数秒まで縮めることは可能でしょうか?
宜しくお願いします。

以下現状のコード(1ファイル目)です。2ファイル目も同様の処理です。
行データを配列に変換している部分のソースは、サイトからのコピペを使用してます。
(ArrayListの部分をList(Of string)に変更していますが)
CsvToListの部分の元ソース

環境:Visual Studio 2008 (vb.net)

Public M_MODEL As New List(Of model)
Public Structure model
    Dim item_id As String
    Dim bumon_cd As String
    Dim mgt_num As String
    Dim model_cd As String
    Dim pert_cd As String
    Dim type_cd As String
    Dim gds_cmpt_cd As String
    Dim model_nm As String
    Dim pert_nm As String
    Dim type_nm As String
    Dim gds_cmpt_nm As String
    Dim gds_kbn As Integer
    Dim JAN As String
    Dim criterion As Integer
End Structure

Public Function Import_M_MODEL() As Boolean
    Dim ret As Boolean = True
    Dim row As model
    Dim Reader As IO.StreamReader = Nothing
    Dim line As String
    Dim strTemp As String()
    Dim header As Integer = 0

    Try
        Reader = New IO.StreamReader('ファイルパス', SJIS)

        Do Until Reader.EndOfStream
            'ヘッダーは読まない
            If header = 0 Then
                line = Reader.ReadLine
                header = 1
            End If
            line = Reader.ReadLine

            '行単位データを,で分割し、配列へ格納
            strTemp = CsvToList(line)(0)

            row = New model
            '各列に値をセット
            row.item_id = strTemp(0)
            row.bumon_cd = strTemp(1)
            row.mgt_num = strTemp(2)
            row.model_cd = strTemp(3)
            row.pert_cd = strTemp(4)
            row.type_cd = strTemp(5)
            row.gds_cmpt_cd = strTemp(6)
            row.model_nm = strTemp(7)
            row.pert_nm = strTemp(8)
            row.type_nm = strTemp(9)
            row.gds_cmpt_nm = strTemp(10)
            If strTemp(11).Length = 0 Then
                row.gds_kbn = Nothing
            Else
                row.gds_kbn = CInt(strTemp(11))
            End If
            row.JAN = strTemp(12)
            If strTemp(13).Length = 0 Then
                row.criterion = Nothing
            Else
                row.criterion = CInt(strTemp(13))
            End If
            'Listに行を追加
             M_MODEL.Add(row)
        Loop

    Catch ex As Exception
            ret = False
    Finally
        Reader.Close()
    End Try
    Return ret
End Function

以下はCsvToListのソースです。

''' <summary>
''' CSVをListに変換
''' </summary>
''' <param name="csvText">CSVの内容が入ったString</param>
''' <returns>変換結果のList</returns>
Public Function CsvToList(ByVal csvText As String) As List(Of String())
    '前後の改行を削除しておく
    csvText = csvText.Trim(New Char() {ControlChars.Cr, ControlChars.Lf})

    Dim csvRecords As New List(Of String())
    Dim csvFields As New List(Of String)

    Dim csvTextLength As Integer = csvText.Length
    Dim startPos As Integer = 0
    Dim endPos As Integer = 0
    Dim field As String = ""

    While True
        '空白を飛ばす
        While startPos < csvTextLength _
            AndAlso (csvText.Chars(startPos) = " "c _
            OrElse csvText.Chars(startPos) = ControlChars.Tab)
            startPos += 1
        End While

        'データの最後の位置を取得
        If startPos < csvTextLength AndAlso csvText.Chars(startPos) = ControlChars.Quote Then
            '"で囲まれているとき
            '最後の"を探す
            endPos = startPos
            While True
                endPos = csvText.IndexOf(ControlChars.Quote, endPos + 1)
                If endPos < 0 Then
                    Throw New ApplicationException("""が不正")
                End If
                '"が2つ続かない時は終了
                If endPos + 1 = csvTextLength OrElse _
                    csvText.Chars((endPos + 1)) <> ControlChars.Quote Then
                    Exit While
                End If
                '"が2つ続く
                endPos += 1
            End While

            '一つのフィールドを取り出す
            field = csvText.Substring(startPos, endPos - startPos + 1)
            '""を"にする
            field = field.Substring(1, field.Length - 2). _
                Replace("""""", """")

            endPos += 1
            '空白を飛ばす
            While endPos < csvTextLength AndAlso _
                csvText.Chars(endPos) <> ","c AndAlso _
                csvText.Chars(endPos) <> ControlChars.Lf
                endPos += 1
            End While
        Else
            '"で囲まれていない
            'カンマか改行の位置
            endPos = startPos
            While endPos < csvTextLength AndAlso _
                csvText.Chars(endPos) <> ","c AndAlso _
                csvText.Chars(endPos) <> ControlChars.Lf
                endPos += 1
            End While

            '一つのフィールドを取り出す
            field = csvText.Substring(startPos, endPos - startPos)
            '後の空白を削除
            field = field.TrimEnd()
        End If

        'フィールドの追加
        csvFields.Add(field)

        '行の終了か調べる
        If endPos >= csvTextLength OrElse csvText.Chars(endPos) = ControlChars.Lf Then
            '行の終了
            'レコードの追加
            'csvFields.TrimExcess()
            csvRecords.Add(csvFields.ToArray)
            csvFields.Clear()

            If endPos >= csvTextLength Then
                '終了
                Exit While
            End If
        End If

        '次のデータの開始位置
        startPos = endPos + 1
    End While

    'csvRecords.TrimExcess()
    Return csvRecords
End Function
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

check解決した方法

0

すみません。
こんなに時間が空いてしまいました...。

みなさんの修正点を参考にさせていただきましたが、
ファイルは"なしになったので、splitで区切ることにしました。

そして、最初に言われていたマスタ件数より多いファイル件数の為、
どっちにしろマスタの精査が入ることになり、件数が少なくなるようです。

みなさん、ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ハンディターミナル側で処理しているなら、限られたリソースの中でやり繰りしていると思うので自ずと処理能力に限界があるのでは?
そもそもプアリソース下ではCompactとはいえ.NetFramework自体が激遅じゃないですか?

要件によりますが

  • 非同期化してできるだけUIスレッドを止めない→早くなるわけではない
  • CSVを取り込まずに別環境でDBに取り込んでおいてDBを渡してあげる→用途によりけりですが
  • ネイティブのバイナリを書く

あたりで落とし所を見つけるとか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/20 09:17

    回答ありがとうございます。
    やはりそうなってしまいますか...。
    今回の事案では、別環境にDBを用意できないので難しいですが、一番手っ取り早いのは
    この方法そうですね...。
    参考になります。ありがとうございました。

    キャンセル

0

最適化をする場合ボトルネックを探したほうがいいです。
パレートの法則で一部のコードがリソースを大量に消費しているはずです。

あたりをつけて計測してみてください。私がならとりあえず下記を計測します。
・全体時間
・ファイルの読み込み時間
・csvへのパースの時間
・構造体へのアロケート
・構造体の編集
・Listへの追加

私の予想では、読み込みか、Listへの追加が時間かかっているのではないかとおもっています。

読み込み時間が長い場合は、ファイルを分割して必要なファイルしか読まないように構成を考える必要があります。

Listへの追加の時間が問題なら、Listの初期値(何行分のメモリを確保するか)を大きくして、メモリ確保の時間をへらすか、件数を数えて配列することが必要です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/20 18:03

    回答ありがとうございます。
    そうですね。どの処理に時間がかかっているか調べてみることも手でした!
    ファイルの分割は要件的に難しいので、Listへの追加の時間を短くする方で検討してみます。

    キャンセル

  • 2016/01/20 21:16

    処理時間の計測は最適化では必須の作業です。

    35秒の処理時間のうち、30秒がある処理にかかっていれば、ほかの処理は合計しても5秒となります。ほかのすべての処理をチューニングによって5分の1にしたとしても全体の5分の1も改善しないことになります。

    そして処理時間というのは大体においてそうした偏りがあるものです。

    まったく改善できないとしても、処理時間の計測をすることをお勧めします。

    キャンセル

  • 2016/01/27 09:35

    さらに追加のコメントありがとうございます。
    すみません。気付かなくて...。

    時間を計測してみました。(秒)
    1つ目のファイル
    データ読込(readLine)の合計:2.0
    CSV解析(CsvToList)の合計:6.9
    構造体にセット(rowへの代入)の合計:3.0
    リストに追加(list.add)の合計:0.06

    2つ目のファイル
    データ読込(readLine)の合計:3.4
    CSV解析(CsvToList)の合計:19.3
    構造体にセット(rowへの代入)の合計:11.9
    リストに追加(list.add)の合計:0.07

    この数字を見る限り、CSV解析と構造体へのセットをどうにかしないと駄目みたいです。
    調整してみます。

    キャンセル

0

いくつか不思議に思える部分があるので聞いてもいいですか?


番号リストDim ret As String = True
なぜ、String型 の変数に Boolean型 の値を入れているのでしょうか?


CsvToListメソッドの ArrayList を List(Of string) にしていると書いてありますが、
CsvToListメソッドの戻り値を受ける strTemp が
List(Of string)型 でなく String()型 なのはなぜでしょうか?


strTemp = CsvToList(line)(0)
この末尾の(0)の意味が分からないのですが、これは何でしょうか?
できれば CsvToList のソースも記述していただいてよろしいでしょうか?


私は .Net Framework 3.5 を使用していますが、
.Net Compact Framework Compact 3.5 は使用したことがないので、
私の知識が足りないだけかもしれません。
もしよろしければ教えてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/27 09:27

    確認が遅くなりすみません。

    質問の回答ですが、変数retはBoolean型でした。(最初Stringにしようと思っていてそのままに...。) 修正しておきます!

    CsvToListですが、参考にしたサイトでは、ArrayListを戻り値としていました。
    ただ今回はListを使用しているのでその形に合わせようとした結果です。
    CsvToListのソースを記載します。

    キャンセル

  • 2016/01/28 10:37

    CsvToListメソッドのArrayListをListに変更していることで
    バグが混入していますね。
    戻り値が List(Of String()) ということは二次元配列みたいになっています。
    データ中に LF を含む値があった場合は結果がおかしくなると思います。
    結果に問題ないということは入力データの値の中に LF を含むものが
    ないということなのでしょう。

    バグを直すにはCsvToListメソッドを以下のようにします。

    誤:Public Function CsvToList(ByVal csvText As String) As List(Of String())
    正:Public Function CsvToList(ByVal csvText As String) As List(Of String)

    誤:Dim csvRecords As New List(Of String())
    正:Dim csvRecords As New List(Of String)

    誤:csvRecords.AddRange(csvFields)
    正:csvRecords.Add(csvFields.ToArray)

    Import_M_MODELメソッドは以下のようにします。

    誤:Dim strTemp As String()
    正:Dim strTemp As List(Of String)

    誤:strTemp = CsvToList(line)(0)
    正:strTemp = CsvToList(line)

    ただしバグを直したからといって速度が速くなるわけではないのですが・・・

    キャンセル

  • 2016/01/28 10:39

    CsvToListメソッドをパフォーマンスチューニングするには。

    値の中に LF を含むことがないのであれば、
    CsvToListメソッドのなかで LF の判定をしている部分を削除したり、
    csvFields から csvRecords に移し替える部分を削除できるでしょう。

    列の数が決まっているのであれば List(Of String) じゃなくて
    String(n) を使用すれば多少は速くなると思います。

    でもよくて1割くらいしか早くならないかな?

    キャンセル

0

文字列の操作(Replaceなど)は、結構重い処理になります。
バイト志向でCSVファイルを解析することが、解析に関しては一番速く処理できそうです。一度、こちらのコードを実行していただいて、その速度がどんなものか試されると、マシンスペック上の限界を知るご参考になるかもしれません。

(Windowsフォームにボタンを貼っています)

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim sjisEncoding As System.Text.Encoding = System.Text.Encoding.GetEncoding(932)

        Dim filePath As String = "C:\SAMPLE_SJIS.CSV" ' 入力ファイルパス
        Dim result As List(Of Object) = New List(Of Object) ' 出力データ

        Dim readHeader As Boolean = False   ' ヘッダ行を読み終わったらTrue

        Using fs As New System.IO.FileStream(filePath, IO.FileMode.Open)
            Dim record As List(Of String) = New List(Of String)
            Dim byteBuffer(256) As Byte
            Dim byteBufferPosition As Integer = 0
            Dim inQuotes As Boolean = False
            Dim leadingByteData As Byte = 0
            Dim byteData As Integer

            Do
                byteData = fs.ReadByte()
                If byteData = -1 Then Exit Do

                If byteBuffer.Length < byteBufferPosition - 1 Then Throw New ApplicationException("1フィールドの長さがバッファサイズ付近に達しています") ' -1 は、SJISコード処理などで2バイト書く可能性から

                If IsSJisLeadingByte(leadingByteData) Then
                    ' SHIFT JIS の2バイト目
                    byteBuffer(byteBufferPosition) = leadingByteData
                    byteBufferPosition += 1
                    byteBuffer(byteBufferPosition) = CType(byteData, Byte)
                    byteBufferPosition += 1
                    leadingByteData = 0
                    Continue Do
                End If

                Select Case byteData
                    Case 10 ' LFコード
                        If leadingByteData = 13 Then ' 1つ前はCR
                            If 0 < byteBufferPosition Then
                                Dim v As String = sjisEncoding.GetString(byteBuffer, 0, byteBufferPosition)
                                record.Add(v)
                                byteBufferPosition = 0
                                leadingByteData = 0
                            End If

                            ' 1レコード終了
                            If Not readHeader Then
                                readHeader = True
                            Else
                                result.Add(record)
                            End If
                            record = New List(Of String)
                            Continue Do
                        End If
                        Throw New ApplicationException("不自然な箇所にLFコードが見つかりました")
                    Case 13 ' CRコード
                        If leadingByteData = 34 Then
                            ' 直前は終了の引用符
                            inQuotes = False
                        End If
                        If inQuotes Then Throw New ApplicationException("フィールドの途中にCRコードが見つかりました")
                        leadingByteData = 13
                        Continue Do
                    Case 32 ' 空白
                        If Not inQuotes Then
                            ' 二重引用符内でなければ、無視する
                            Continue Do
                        End If
                    Case 34 ' 二重引用符
                        If Not inQuotes Then
                            ' 開始の引用符
                            inQuotes = True
                        Else
                            If leadingByteData = 34 Then    ' 1つ前も二重引用符だった
                                byteBuffer(byteBufferPosition) = 34 ' 1つだけにする
                                byteBufferPosition += 1
                                leadingByteData = 0
                            Else
                                leadingByteData = 34    ' 次まで保留
                            End If
                        End If
                        Continue Do
                    Case 44 ' カンマ
                        If leadingByteData = 34 Then
                            ' 直前は終了の引用符
                            inQuotes = False
                        End If
                        If Not inQuotes Then
                            ' 二重引用符内でなければ、フィールドの区切りとみなす
                            '                            byteBuffer(byteBufferPosition) = 0
                            Dim v As String = sjisEncoding.GetString(byteBuffer, 0, byteBufferPosition)
                            record.Add(v)
                            byteBufferPosition = 0
                            leadingByteData = 0
                            Continue Do
                        End If
                        ' 二重引用符内なら、通常の文字扱い
                End Select
                If IsSJisLeadingByte(byteData) Then
                    ' SHIFT JIS の1バイト目
                    leadingByteData = CType(byteData, Byte)
                    Continue Do
                End If

                ' 1バイト文字
                byteBuffer(byteBufferPosition) = CType(byteData, Byte)
                byteBufferPosition += 1
                leadingByteData = 0
            Loop
            fs.Close()
        End Using

        ' result に、結果(List(Of String)型)が入っています。
    End Sub

    ' バイト値が SHIFT JIS の1バイト目とみなせればTrue、それ以外はFalseを返します。
    Private Shared Function IsSJisLeadingByte(ByVal s As Byte) As Boolean
        Return (&H81 <= s AndAlso s <= &H9F) OrElse (&HE0 <= s AndAlso s <= &HFC)
    End Function
End Class

こんにちは。
私もCompactFrameworkを使用したことがないので、とんちんかんなことがありましたらご容赦ください。
次のような箇所で改善できるかな、と思いました(「元のソース」の内容と重複したものもあります)

他にも思いつき次第、挙げてみます。

ただ、限界がありそうでしょうから、dojikkoさんの仰られるように、ワーカースレッドとUIスレッドと分離して、操作感を確保することが一番有用だったりするかもしれません。

追加で...
CsvToList関数に汎用性を持たせたい理由がないならば、CsvToList関数内でmodelデータを生成してそれを戻り値にすると、速度はいかがでしょう?
現状のコードですと、CSVのフィールド数がどこかのレコードで万一不足していると、どのみち配列のOutOfRange例外が発生してしまいます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/27 13:14

    コメントありがとうございます。
    TextFieldParserを使用することに関してですが、.NetCompactでは対応してないんです...。
    なのでTextFieldParserが実装されていなくてもできる処理で行っています。

    ODBCドライバはできなかったような...?確認してみます!
    ReadAllLinesは、やってみたんですが、メモリ不足で...。

    CsvToListの処理は、別でも使っているので中で生成は難しいですが、
    見直す必要有ですね...

    もう少し頑張ってみます。

    キャンセル

  • 2016/01/27 13:37

    なるほど、メモリを大量に使う手段はとりずらいのですね。
    組み込み系開発の道は厳しいですね...

    キャンセル

  • 2016/01/29 13:48

    ベタに組んでいたC言語開発時代が懐かしくなって...サンプルコードを組んでみました。
    組み込み系のようなメモリリソースが潤沢にない環境では、ちょこちょこと動かしていくことが速い気がしました。

    試してはありますが、エラーなど出てしまいましたら修正をしていただければと思います(Compact Framework に対応していなかったりしましたら、ご容赦ください。OrElseやAndAlsoは、VS2008で解釈不能でしたら Or や And にしても差し支えないです)。

    キャンセル

0

動作検証
検証土台がアレなんで参考データ程度です。

参考にもならんか。

csv-reader 部:RFC-4180 準拠、セル内改行、エスケープ文字認識、行末改行コードは、windows,unix,旧mac 3種類判別
cav-writer 部:ダブルクオート囲み、カンマ区切り、文字列内エスケープ

動作環境:
   windows core i5 dual core, 3.3mhz, 4gb memory
   java8
実行時間:
    reader   420ms
    writer   1240ms
csv データ内容:
     18 カラム、ヘッダ無し、1カラムあたり最大40文字、全角半角混在、ファイルサイズ平均 5mb
      15000 行、各カラムはダブルクオートで囲まれる、半角カンマ前後にスペースは無い、
      サンプルデータ作り込むのがしんどいので、幾つか条件付けました。

ジャンヌ.netの csvtolist メソッドは、1文字ずつ解析してます。上記javaのcsv-reader/writerも1文字ずつ解析しながらやっています。
で、幾つかの前提条件をつけることで、読み込み処理を高速化できます。

  1. すべてのカラムはダブルクオートで囲まれること
  2. すべてのカラムは半角カンマ区切りで前後にスペースがないこと
  3. カラム中のデータにダブルクオートが含まれないこと
  4. カラム中のデータに改行コードが含まれないこと
  5. カラム中のデータに半角カンマが含まれないこと

幾つかの前提条件次第では、
1行読み込み、カンマ分割、先頭+1〜末尾-1をカラムデータとして抽出
これを繰り返すだけで文字列リストになりますね。

入力csvのデータ仕様を再確認して、このcsvさえ読めればいい、特化した読み込み処理で十分だと思いますがどうででょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/27 15:56

    ファイル読み込みは、一括で読み込み、1行分ずつ抽出する方がディスクアクセスが減らせまづ。
    ハードディスクの場合、1バイトの読み込みでも、1ms以下にはなりません。ssdや、flashromなら1行ずつ読んでも気にするほどの速度劣化は無いででょう。
    書き込みもバッファリング使い、書き込み回数を減らす工夫を。csv読むだけだから書き込みは無いのか。
    1. 一括読込、1行ずつ切り分け。
    2. 半分読んで、
    3. 10回読んで、
    4.毎回 readline で、
    兎に角遅いって言っても今の状態では工夫の余地が一杯あります。
    頑張ってください。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る