我撰寫了用于生成點的代碼,它將每秒生成一個資料幀并繼續生成。每個資料幀有 1000 行和 7 列。它是使用 while 回圈實作的,因此每次迭代都會生成一個資料幀,并且必須將其附加到檔案中。我應該使用檔案格式來管理記憶體效率嗎?哪種檔案格式占用的記憶體更少。?誰能給我一個建議..使用csv可以嗎?如果是這樣,我應該使用什么資料型別。目前我的資料幀具有 int16 值。我應該附加相同的值還是應該將其轉換為二進制格式或位元組格式?
uj5u.com熱心網友回復:
numpy陣列可以以二進制格式存盤。由于您只有一個int16資料型別,因此您可以創建一個 numpy 陣列并撰寫它。每個 int16 值將有 2 個位元組,這對于大小來說是相當好的。訣竅是您在稍后閱讀時需要知道存盤資料的維度。在這個例子中,它是硬編碼的。這有點脆弱 - 如果您改變主意并稍后開始使用不同的維度,則必須轉換舊資料。
假設您想稍后讀取一堆 1000x7 資料幀,您可以執行以下示例的操作。作者不斷附加 1000x7 int16s,而讀者將它們分塊回資料幀。如果您不使用任何特定于 pandas 本身的東西,那么您最好堅持使用 numpy 進行所有操作并跳過演示的轉換。
import pandas as pd
import numpy as np
def write_df(filename, df):
with open(filename, "ab") as fp:
np.array(df, dtype="int16").tofile(fp)
def read_dfs(filename, dim=(1000,7)):
"""Sequentially reads dataframes from a file formatted as raw int16
with dimension 1000x7"""
size = dim[0] * dim[1]
with open(filename, "rb") as fp:
while True:
arr = np.fromfile(fp, dtype="int16", count=size)
if not len(arr):
break
yield pd.DataFrame(arr.reshape(*dim))
import os
# ready for test
test_filename = "test123"
if os.path.exists(test_filename):
os.remove(test_filename)
df = pd.DataFrame({"a":[1,2,3], "b":[4,5,6]})
# write test file
for _ in range(5):
write_df(test_filename, df)
# read and verify test file
return_data = [df for df in read_dfs(test_filename, dim=(3,2))]
assert len(return_data) == 5
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/443852.html
