Я не буду напрямую отвечать на этот вопрос, как это уже делали другие, но я действительно задаюсь вопросом, стоит ли вставлять все зависимости в jar самого проекта.
Я вижу точку (простота развертывания / использования), но это зависит от варианта использования вашего проекта (и могут быть альтернативы (см. ниже)).
Если вы используете его полностью автономно, почему бы и нет.
Но если вы используете свой проект в других контекстах (например, в webapp или забрасываете в папку, где сидят другие банки), у вас могут быть дубликаты дубликатов в вашем пути к классам (те, которые находятся в папке, то есть в банках ). Возможно, это не сделка с предложением, но я обычно избегаю этого.
Хорошая альтернатива:
Как и в случае с манифестом и «специальным динамическим классом загрузчика», вы может начать свой проект с:
java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass
Параметр low_memory
устарел неправильно, но он должен быть, поскольку он фактически не делает ничего по-другому [ source ]
Причина, по которой вы получаете это предупреждение low_memory
, состоит в том, что угадывание dtypes для каждого столбца очень требует памяти. Pandas пытается определить, какой dtype задавать, анализируя данные в каждом столбце.
Pandas может определять только то, что должен иметь столбец dtype после всего файла читается. Это означает, что ничего не может быть проанализировано до того, как весь файл будет прочитан, если вы не рискуете изменить dtype этого столбца при чтении последнего значения.
Рассмотрим пример одного файла с столбцом user_id , Он содержит 10 миллионов строк, где user_id всегда является числом. Поскольку панды не могут знать, что это только цифры, это, вероятно, сохранит их как исходные строки, пока не прочитает весь файл.
/ g15]
dtype={'user_id': int}
к вызову pd.read_csv()
заставит pandas знать, когда он начнет считывать файл, что это только целые числа.
Также стоит отметить что если бы последняя строка в файле имела бы "foobar"
, записанную в столбце user_id
, загрузка была бы сбой, если указан указанный выше тип dtype.
import pandas as pd
from StringIO import StringIO
csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": object})
ValueError: invalid literal for long() with base 10: 'foobar'
dtypes, как правило, многозначительные вещи, подробнее о них здесь: http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
Это numpy dtypes, которые также принимаются в pandas
[numpy.generic,
[[numpy.number,
[[numpy.integer,
[[numpy.signedinteger,
[numpy.int8,
numpy.int16,
numpy.int32,
numpy.int64,
numpy.int64,
numpy.timedelta64]],
[numpy.unsignedinteger,
[numpy.uint8,
numpy.uint16,
numpy.uint32,
numpy.uint64,
numpy.uint64]]]],
[numpy.inexact,
[[numpy.floating,
[numpy.float16, numpy.float32, numpy.float64, numpy.float128]],
[numpy.complexfloating,
[numpy.complex64, numpy.complex128, numpy.complex256]]]]]],
[numpy.flexible,
[[numpy.character, [numpy.bytes_, numpy.str_]],
[numpy.void, [numpy.record]]]],
numpy.bool_,
numpy.datetime64,
numpy.object_]]
Pandas также добавляет два типа dtypes: categorical
и datetime64[ns, tz]
, которые недоступны в numpy
Settin g dtype=object
отключит вышеуказанное предупреждение, но не сделает его более эффективным с точки зрения памяти, только эффективно.
Настройка dtype=unicode
ничего не сделает, поскольку до numpy, unicode
представленный как object
.
@sparrow правильно указывает на использование преобразователей, чтобы избежать взрыва панд при столкновении 'foobar'
в столбце, указанном как int
, Я хотел бы добавить, что преобразователи действительно тяжелы и неэффективны для использования в пандах и должны использоваться в качестве последнего средства. Это связано с тем, что процесс read_csv представляет собой один процесс.
Файлы CSV могут обрабатываться по строкам и, следовательно, могут быть обработаны несколькими преобразователями параллельно более эффективно, просто разбивая файл на сегменты и запуская несколько процессов, то, что панды не поддерживают. Но это совсем другая история.
Попробуйте:
dashboard_df = pd.read_csv(p_file, sep=',', error_bad_lines=False, index_col=False, dtype='unicode')
Согласно документации pandas:
dtype: имя типа или dict столбца -> тип
blockquote>Что касается low_memory, то по умолчанию он по умолчанию и еще не задокументирован. Я не думаю, что это имеет значение. Сообщение об ошибке является общим, поэтому вам все равно не нужно возиться с low_memory. Надеюсь, что это поможет и сообщит мне, если у вас возникнут дополнительные проблемы
У меня была аналогичная проблема с файлом ~ 400 МБ. Установка low_memory = False сделала трюк для меня. Сначала делайте простые вещи, я бы проверял, что ваш фреймворк не больше вашей системной памяти, перезагрузитесь, очистите оперативную память перед продолжением. Если вы все еще сталкиваетесь с ошибками, стоит убедиться, что ваш CSV-файл в порядке, быстро просмотрите Excel и убедитесь, что нет очевидной коррупции. Сломанные исходные данные могут привести к хаосу ...
df = pd.read_csv('somefile.csv', low_memory=False)
Это должно решить проблему. Я получил точно такую же ошибку при чтении строк 1.8M из CSV.
Как упоминалось ранее firelynx, если dtype явно указано, и есть смешанные данные, которые несовместимы с этим dtype, тогда загрузка будет аварийна. Я использовал такой конвертер как обходной путь для изменения значений с несовместимым типом данных, чтобы данные все равно могли быть загружены.
def conv(val):
if not val:
return 0
try:
return np.float64(val)
except:
return np.float64(0)
df = pd.read_csv(csv_file,converters={'COL_A':conv,'COL_B':conv})