

# Overview

* * *

行おうとしたことを簡単に書きます：

  1. pd.DataFrameに入ったテキストデータをsentence transfomerに入力し，sentence embeddingを得る．
  2. そのsentence embeddingをemb_listというlist型にappend()で追加．
  3. そのlistをpickle.dump()でpickleファイルに保存
  4. そのpickleファイルを読み込もうとpickle.load()で読み込み

4.を実行すると`EOFError: Ran out of input`が発生．

# Details

* * *

ここから詳細に入りますが，その前にDataFrameの準備から：

[code]

    from urllib.request import urlretrieve
    import pandas as pd
    
    # Download the parquet table
    table_url = f'https://huggingface.co/datasets/poloclub/diffusiondb/resolve/main/metadata.parquet'
    urlretrieve(table_url, 'metadata.parquet')
    
    # Read the table using Pandas
    df_2m = pd.read_parquet('metadata.parquet')
    
[/code]

df_2m['prompt']の各行には，次のようにstr型のオブジェクトが入っています：

[code]

    1          a portrait of a female robot made from a cloud...
    2              only memories remain, trending on artstation 
    3                           dream swimming pool with nobody 
    4                   a dog doing weights. epic oil painting. 
                                     ...                        
    1999995    david bowie giving a piggy back ride to ziggy ...
    1999996    david bowie giving a piggy back ride to ziggy ...
    1999997                                      funny computer 
    1999998                   hilarious witty computing machine 
    1999999     hilarious witty computing machine, lichtenstien 
    Name: prompt, Length: 2000000, dtype: object
    
[/code]

以下，行おうとしたこと1～3：

[code]

    import sys
    from sentence_transformers import SentenceTransformer, models
    
    # pathの追加
    sys.path.append('./sentence-transformers-2-2-2/sentence-transformers')
    
    # sentence transformerの読み込み
    st_model = SentenceTransformer('./sentence-transformers-2-2-2/all-MiniLM-L6-v2')
    
    emb_list = []
    for i, row in df_2m.iterrows():
        # 1.sentence embeddingを出力
        emb = st_model.encode(row['prompt'])
        # 2. sentence embeddingをemb_listに追加
        emb_list.append(emb)
        if ((i+1) % 1000)==0:
            print(f'Saved at {i+1} prompts.')
            # 3. pickleファイルに保存
            with open('./SD2GPT2/2M/embedding_2M_0.pickle', 'wb') as f:
                pickle.dump(emb_list, f)
    
[/code]

4.pickleファイルの読み込み：

[code]

    with open('./SD2GPT2/2M/embedding_2M_0.pickle', 'rb') as f:
        print(f)
        emb_list0 = pickle.load(f)
    
[/code]

読み込めず，エラー：

[code]

    ╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
    │ in <module>                                                                                      │
    │                                                                                                  │
    │   1 with open('./SD2GPT2/2M/embedding_2M_0.pickle', 'rb') as f:                                  │
    │ ❱ 2 │   emb_list1 = pickle.load(f)                                                               │
    │   3                                                                                              │
    ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
    EOFError: Ran out of input
    
[/code]

# Question

* * *

ファイルが空でないことは確認しました．

  * なぜこのエラーが発生したのか
  * どうすれば読み込めるようになるか

をお教えください．

# P.S.

* * *

1000行だけ，次に10000行だけ，そして100000行だけでファイルへの保存と読み込みを行ったところ，読み込みができるようになりました．  
データ量のせい？もしくは何か他に原因がある？  
pickleの仕様をあとで調べてみます．


CC BY-SA 4.0
2023-04-07T17:05:46.180
94442
2023-04-07T21:39:40.203
2023-04-07T21:39:40.203
39908
39908
question
python
pickleファイルを読み込もうとした際に発生したEOFErrorについて