Для синтаксического анализа файла большего размера мне нужно последовательно выполнять циклическую запись в большое количество паркетных файлов. Однако похоже, что память, потребляемая этой задачей, увеличивается на каждой итерации, тогда как я ожидал бы, что она останется постоянной (поскольку в память ничего не должно добавляться). Это усложняет масштабирование.
Я добавил минимально воспроизводимый пример, который создает 10 000 паркета и к нему добавляется петля.
import resource
import random
import string
import pyarrow as pa
import pyarrow.parquet as pq
import pandas as pd
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
schema = pa.schema([
pa.field('test', pa.string()),
])
resource.setrlimit(resource.RLIMIT_NOFILE, (1000000, 1000000))
number_files = 10000
number_rows_increment = 1000
number_iterations = 100
writers = [pq.ParquetWriter('test_'+id_generator()+'.parquet', schema) for i in range(number_files)]
for i in range(number_iterations):
for writer in writers:
table_to_write = pa.Table.from_pandas(
pd.DataFrame({'test': [id_generator() for i in range(number_rows_increment)]}),
preserve_index=False,
schema = schema,
nthreads = 1)
table_to_write = table_to_write.replace_schema_metadata(None)
writer.write_table(table_to_write)
print(i)
for writer in writers:
writer.close()
Кто-нибудь знает, что вызывает эту утечку и как ее предотвратить?
Панды: 0.22.0 PyArrow: 0.10.0
Пожалуйста, обновитесь до pandas>=0.23
. В Pandas есть утечка, которая также влияет на pyarrow
.
Пробовал и у меня такая же утечка памяти.
Мне помогло обновление до pyarrow==0.15.0
.
Мы не уверены, что случилось, но некоторые другие пользователи сообщали о нераспознанных утечках памяти. Я добавил ваш пример в одну из проблем отслеживания JIRA https://issues.apache.org/jira/browse/ARROW-3324
Вы можете указать свою версию панд?