Django:上传csv文件并保留在内存中

时间:2018-05-30 20:57:01

标签: django

我正在尝试使用Django构建一个Web应用程序,用户将上传一些csv文件,可能是一个很大的文件。然后代码将清除文件中的坏数据,然后用户可以使用它来使用干净的数据进行查询。

现在我相信每当用户进行查询时,整个代码将再次运行,这意味着它将再次开始清理,依此类推。

问题:

有没有办法一旦csv数据处于干净状态,它会留在内存中,用户可以查询干净的数据吗?

import pandas as pd

def converter(num):
    try:
        return float(num)
    except ValueError:
        try:
            num = num.replace("-", '0.0').replace(',', '')
            return float(num)
        except ValueError:
            return np.nan

def get_clean_data(request):
    # Read the data from csv file:
    df = pd.read_csv("data.csv")

    # Clean the data and send JSON response
    df['month'] = df['month'].str.split("-", expand=True)[1]
    df[df.columns[8:]] = df[df.columns[8:]].astype(str).applymap(converter)
    selected_year = df[df["Departure Datetime: Year (YYYY)"] == 2015]
    data_for_user = (selected_year.groupby(
        by="route").sum().sort_values(by="revenue").to_json()

    return JsonResponse(data_for_user, safe=False)

1 个答案:

答案 0 :(得分:2)

实现此目的的一种方法是在清理数据帧后将其缓存在内存中。然后,后续请求可以使用缓存中的已清理版本。

from django.core.cache import cache

def get_clean_data(request):
    # Check the cache for cleaned data
    df = cache.get('cleaned_data')

    if df is None:
        # Read the data from csv file:
        df = pd.read_csv("data.csv")

        # Clean the data
        df['month'] = df['month'].str.split("-", expand=True)[1]
        df[df.columns[8:]] = df[df.columns[8:]].astype(str).applymap(converter)

        # Put it in the cache
        cache.set('cleaned_data', df, timeout=600)

    selected_year = df[df["Departure Datetime: Year (YYYY)"] == 2015]
    data_for_user = (selected_year.groupby(
        by="route").sum().sort_values(by="revenue").to_json()

    return JsonResponse(data_for_user, safe=False)

你需要小心一点,因为如果csv文件非常大,缓存时可能会占用大量内存。

Django支持许多不同的cache backends,从简单的local memory caching到更复杂的memcached caching