cross processes shared arrays

Tbear

New member
cross processes shared arrays

יש לי מערך גדול שאני מחזיק בזכרון, ואני רוצה לשתף אותה בין כמה threadים (או ליתר דיוק פרוססים)..
אני מכיר את היכולות של APC וMEMCACHE אבל הן לא מספיק טובות בשבילי, המערך שלי יוצא ממש גדול ואני צריך גישה ממש מהירה אליו,
וממה שאני מבין גם memcache וגם APC מחזירים לי ערכים BY VALUE, וזה אומר שכל פרוסס יעתיק לעצמו מערך עם אלפי רשומות, וזה זלילת זכרון לא שפויה.
אני רוצה פשוט שכל פרוסס יוכל לקבל רפרנס למערך הזה ושהוא יוחזק בshared memory בין כל הפרוססים.
זה מערך שגדל במהירות ומשתנה כל הזמן, אז להשתמש בShared Memory המובנה של הPHP זה לא נח כי ממה שקראתי צריך להגדיר מראש לאיזה גודל הוא גדל.

מישהו מכיר טכניקה טובה לזה?
 

intval

New member
משהו בארכיטקטורה שלך כנראה לא נכון

ונכון שהם מחזירים by value אבל אתה צריך את כל המערך כולו בכל אחד מהפרוצסים? ומה קורה אם שני פרוצסים מנסים לגשת למערך במקביל, אחד לקרוא ואחד לשנות? מי ינהל לוקים?אתה?

אני בטוח ב 99% אחוז שהבעיה שאתה מנסה לפתור באמצעות המערך הזה נפתרת בצורה הרבה יותר פשוטה.
תתחיל מלספר מה הבעיה.
 

Tbear

New member
האמת שמצאתי פתרון על APC

הבעיה שלי מךלכתחילה הייתה שאני צריך לשמור סטטיסטיקות על אלפי פעולות ולבצע עליהם אגרגציה אל תוך מבנה נתונים שיגיד לי כמה משתמשים ביצעו איזה פעולה, ורק אחת לX זמן הם יישמרו לDB, כמובן שהאגרגציה צריכה להיות בין כלל הפרוססים.

אי אפשר לבצע את זה רק על בסיס DB כיוון שזה יטחן לו את הצורה, ויאט בצורה משמעותית את המערכת.

פתרתי את זה עם שימוש בAPC בתור מערך גדול של KEYS, וכל פעם שמתבצעת פעולה אני קורה לapc_inc וזה מעלה ב1 את הערך של תא מסויים בלי שאני צריך לשלוף את המידע מתוכו.

אחת לשלוש דקות אני עובר על הAPC באמצעות APCIterator ומרוקן אותו אל תוך הDB..

ממה שאני יודע על הAPC הוא שאין בעיה של deadlocks ושהוא synchronized...





כמובןם שפתרון עם ביצועים טובים יותר היה לכתוב את זה בJAVA, ולהשתמש בhashMaps / hashSet.
אבל אין לי זמן או כח לשכתב את המערכת כולה..
 

Tbear

New member
תודה, אני אקרא, ואולי אעבור אליו...


 
למעלה