在機器學習領域,由於Python中包含較多的機器學習資源,難免會涉及到不同語言之間的交互【Java調用python】。從而會涉及到非python基礎數據類型的傳輸,如pandas中的DataFrame進行數據的傳輸。
可以通過pandas中的
1 # 1. msgpack 2 to_msgpack() # set 3 read_msgpack() # get 4 # 2. json 5 to_json() # set 6 read_json() # get
兩種方式將數據序列化成redis中 set和get可操作的類型。
操作步驟
- 數據准備;
- redis准備;
- 使用DataFrame中的.to_msgpack()方法或者.to_json方法將數據類型為DataFrame的數據進行序列化;
- 為序列化后的變量set到redis中;
- 通過給序列化后的變量的名字(字符串)get redis中的內容;
- 使用.read_msgpack()方法或者.read_json()方法將序列化的內容進行反序列化。
下述代碼中按照上述步驟,使用msgpack 和 json 依次將DataFrame放入redis中,再從redis中取出。並比較了二者的時間消耗。【msgpack在處理DataFrame的時間更快】
1 import redis 2 import json 3 import pandas as pd 4 import time 5 # json 的序列化和反序列化可以能夠使redis中的set 和 get 實現字典和列表上傳和下載 使用起來更加輕便 6 # 而用使用hash操作來針對字典類型, lpush類型來針對list類型 7 data_frame_info = pd.read_csv('data.csv') 8 r = redis.StrictRedis(host='localhost', port=6379, password=123456) 9 msgpack_time = time.time() 10 df_bytes = data_frame_info.to_msgpack() # 序列化 11 r.set("data_fram_info", df_bytes) # 存入redis 12 res_dataframe = r.get("data_fram_info") # 從redis中獲取 13 res_data_frame = pd.read_msgpack(res_dataframe) # 反序列化為DataFrame 14 15 pd.set_option('display.max_columns', 1000000) # 可以在大數據量下,沒有省略號 16 pd.set_option('display.max_rows', 1000000) 17 pd.set_option('display.max_colwidth', 1000000) 18 pd.set_option('display.width', 1000000) 19 20 # print(res_data_frame) 21 print("\033[42;1m%s\033[0m" %("msgpack_time:"), time.time()-msgpack_time) 22 23 json_time = time.time() 24 df_bytes1 = data_frame_info.to_json() 25 r.set("data_fram_info1", df_bytes1) 26 res_dataframe1 = r.get("data_fram_info1") 27 res_data_frame1 = pd.read_json(res_dataframe1) 28 29 pd.set_option('display.max_columns', 1000000) 30 pd.set_option('display.max_rows', 1000000) 31 pd.set_option('display.max_colwidth', 1000000) 32 pd.set_option('display.width', 1000000) 33 # print(res_data_frame1) 34 print("\033[42;1m%s\033[0m" %("json_time:"), time.time()-json_time)
如果同時需要從redis中獲取多個DataFrame,可以使用map迭代調用rs.get()方法和pd.read_msgpack()方法,並將獲取到的內容依次進行賦值。如下述代碼所示:
1 rs_list = list(map(rs.get, [x_train, y_train, x_test, y_test, y_test_id])) 2 rs_context = list(map(pd.read_msgpack, rs_list)) 3 x_train, y_train, x_test, y_test, y_test_id = [i for i in rs_context]